容器编排-K8S

2021/03/30

参考资料

一、K8S介绍

Kubernetes 是 Google 基于 Borg 开源的容器编排调度引擎,作为 CNCF(Cloud Native Computing Foundation)最重要的组件之一,它的目标不仅仅是一个编排系统,而是提供一个规范,可以让你来描述集群的架构,定义服务的最终状态,Kubernetes 可以帮你将系统自动得达到和维持在这个状态。

更具体的说,Kubernetes 用户可以通过编写一个 YAML 或者 json 格式的配置文件,也可以通过工具 / 代码生成或直接请求 Kubernetes API 创建应用,该配置文件中包含了用户想要应用程序保持的状态,不论整个 Kubernetes 集群中的个别主机发生什么问题,都不会影响应用程序的状态,你还可以通过改变该配置文件或请求 Kubernetes API 来改变应用程序的状态。

1.1 K8S整体架构,功能介绍

  • Kubernetes Master : 主节点
    • API Server:请求统一入口
    • Scheduler:节点调度、任务发布
    • Controller Manager:资源统筹管理,资源任务统一调度部署
      • replication controller:复制控制器
      • namespace controller:
    • Etcd:配置集群管理(数据库)
    • Network-Flannel calico canal:通信
    • Node`s Companents
  • Node
    • kubelet: 节点管理,容器的启停管理、分配网络资源…
    • kubelet-proxy(service?):服务发现、通信
    • docker:容器,需要真正运行的
    • Pod:运行在一个node上,Kubernetes的最小工作单元,pod中的容器共享网络和存储
      • 一个 Pod 可以有多个容器,在现实场景中,一般一个pod对应一个容器
      • 一个pod对应一个ip(相当于一个逻辑主机),并且这个ip是短暂的,重启后ip会出现变化
    • controller:控制器
      • deployment:部署无状态应用,例如 微服务应用
      • stateSet:部署有状态应用,例如 mysql主从
      • replicaSet
      • daemonSet:
      • job 一次性任务
      • cronjob 定时任务
  • service:是一个抽象概念,它定义了一组服务的多个pod逻辑合集和访问pod的策略
    • 1、能够管理一组pod,为一组具有相同功能的pod提供一个统一的入口地址
    • 2、对组内的pod进行服务发现和负载均衡
    • 3、service将请求进行负载分发到后端的各个POD实例上,客户端只需要访问 Service 的 IP,Kubernetes 则负责建立和维护 Service 与 Pod 的映射关系

二、K8S基础集群搭建-3节点

  • 使用 kubeadm 创建 K8S 集群
  • 使用 kind 创建 K8S 集群
  • 使用 Kubespray 创建 K8S 集群

CentOS 上部署 Kubernetes 集群

软件安装-docker、kubelet、kubeadm、kubectl
master上创建集群-kubeadm init & kubeadm apply
node加入集群-kubeadm join

三、K8S原理剖析与实战

5 【原理剖析】K8S调度原理剖析与Pod生命周期管理

6 【原理剖析】K8S控制器管理原理剖析与实战

7 【原理剖析】Yaml配置实战总结

8 【原理剖析】K8S网络模型原理剖析与实战

9 【原理剖析】K8S服务发现与负载均衡原理剖析与实战

10 【架构思考】K8S系统分层架构回顾和故障排除思路

11 【原理剖析】K8S存储原理剖析与实战

12 【原理实战】K8S存储原理实战-1

13 【原理实战】K8S存储原理实战-2

14 【原理剖析】K8S认证授权原理剖析与实战

15 【架构思考】如何实现集群访问的安全性、可用性、完整性

16 【核心基本功】K8S管理界面日常操作

17 【知识扩展】K8S集群监控,实现快速故障排查和业务连续性保障

18 【性能监控Demo】prometheus时间序列监控,知其然

19 【日志监控Demo】ELK日志管理,知其所以然

20 【架构思考】如何实现大规模集群?10节点-100节点-1000节点

21 【架构升级】全链路高可用架构升级

22 【知识扩展】如何基于容器编排工具实现CICD

23 【K8S技术落地实战】部署微服务-1

24 【K8S技术落地实战】部署微服务-2

25 【K8S技术落地实战】部署微服务-3

26 【K8S技术落地实战】部署微服务-4

27 【K8S技术落地实战】部署微服务-5

四、kubectl常用命令

## 查看集群信息
kubectl cluster-info

## 查看node信息
kubectl get nodes -o wide

## 查看pod信息
kubectl get pods -A -o wide -n namespace

## 创建 查看namespace
kubectl create namespace abc
kubectl get ns

## 发布删除应用
kubectl apply -f appserver.yaml
kubectl delete -f appserver.yaml

## 查看服务service
kubectl get svc -n namespace1

## 查看ingress
kubectl get ingress -A
kubectl describe ing, svc -n namespace 

## 查看日志
# 输出一个单容器pod POD的日志到标准输出
$ kubectl logs podName

# 持续输出一个单容器pod POD的日志到标准输出
kubectl logs --tail=200 -n default demo-server -f
kubectl logs -f --tail=200 pods/appServer-0 -n default
kubectl logs -f --tail=200 pods/appServer-0 -n default|grep 'time out' 

## 查看服务重启前一版本的日志输出
kubectl logs -f --tail 100 XXXpod -n namespace --previous
 
## 进入pod
kubectl exec -it -n ingress-nginx /bin/bash 

## 查看pod启动失败报错
kubectl describe pod demo-server-645bf9cfbd-ngkr4 -n default

## copy容器内日志文件
kubectl cp default/appServer-0:/opt/1.log /home/1.log

## 动态日志导出
kubectl logs appServer-0 -n default | grep '2022-10-31 17:*' > /tmp/appServer-0.txt

## 导出yaml
kubectl get pods appServer-deployment-0 -n default -o yaml
kubectl get deployment appServer-deployment -n default -o yaml > ./appServer-deployment.yaml
kubectl get service appServer-service -n default -o yaml > ./appServer-service.yaml

## 创建证书
kubectl get secrets -n demo
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/C=CN/ST=BJ/L=BJ/O=nginx/CN=wds.demo.com"
kubectl create secret tls tls-secret --key tls.key --cert tls.crt -n demo

##查看node内存使用
kubectl top node -n namespace1 --sort-by memory  

## 查看pod内存使用
kubectl top po -n namespace1 --sort-by memory 

# 容器创建阻塞,不知道yaml在哪里
kubectl get deployment -n grafana  # 查看副本状态
kubectl scale deployment  grafana --replicas=0 -n grafana  #副本缩为0
kubectl scale deployment  grafana --replicas=1 -n grafana  #副本扩为1

# 扩缩容器副本数
$ kubectl scale deployment DEPLOYMENT --replicas=8
$ kubectl scale statefulset loki --replicas=1 -n loki

# 显示pod节点的标签信息
$ kubectl get pod --show-labels

# 根据指定标签匹配到具体的pod
$ kubectl get pod -l app=example(标签键值对)

# 查看最近几秒,几分,或者几小时,几天的日志信息,--since 选参 
$ kubectl  logs -f -n namespace pod-name --since=1h

# 指定时间戳输出日志
$ kubectl logs podName --since-time=2018-11-01T15:00:00Z
指定某个时间点之后的日志信息查看,--since-time 选参
表示查看12月22号10点之后的日志信息 +00:00 表示这个时间点向前推多长时间的日志
$ kubectl logs -f -n namespace pod-name --since-time="2021-12-22T02:00:00+00:00"

# 查看运行pod的环境变量
$ kubectl exec podName env

## k3s节点证书过期
### k3s证书过期时间检查:
### k3s server:
for i in `ls /var/lib/rancher/k3s/server/tls/*.crt`; do echo $i; openssl x509 -enddate -noout -in $i; done
### 重启k3s更新证书:
systemctl restart k3s
### k3s agent:
for i in `ls /var/lib/rancher/k3s/agent/*.crt`; do echo $i; openssl x509 -enddate -noout -in $i; done
### 重启k3s agent更新证书:
systemctl restart k3s-agent 

五、yml配置总结

apiVersion: batch/v1
kind: Job
metadata:
  name: demo-job
  namespace: demo-ns
spec:
  template:
    metadata:
      name: demo-job
    spec:
      nodeName: 192.168.1.1  //指定pod运行node
      hostAliases:  //配置pod的hosts域名解析
        - hostnames:
            - "h1.tdengine.com"
          ip: 192.168.1.1
        - hostnames:
            - "h2.tdengine.com"
          ip: 192.168.1.2
        - hostnames:
            - "h3.tdengine.com"
          ip: 192.168.1.3
      containers:
      - name: demo-job
        image: demo-job:1.15.1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3100
          name: http
          protocol: TCP
      - env: 
        resources: //资源限制
          limits:
            cpu: "1"
            memory: 2Gi
          requests:
            cpu: 200m
            memory: 256Mi    

六、TLS证书创建、配置、更新

## 1.证书创建或购买  
上传创建或购买的证书xx.key xx.pem

## 2.创建命名空间下的secret 
kubectl create secret tls sre-secret --namespace grafana --key xx.key --cert xx.pem
查看 
kubectl get secrets -n grafana
kubectl get secrets -n grafana sre-secret -o yaml

## 3.编辑业务grafana-ingress.yml,配置域名证书
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: grafana
  namespace: grafana
  labels:
    app.kubernetes.io/name: grafana
    app.kubernetes.io/instance: grafana
spec:
  ingressClassName: nginx
  tls:
    - hosts:
      - grafana.xx.cn
      secretName: sre-secret
  rules:
    - host: grafana.xx.cn
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: grafana
                port:
                  number: 80

## 4.证书过期更新  
上传新的证书xx.key xx.pem  
kubectl delete secrets -n grafana sre-secret
kubectl create secret tls sre-secret --namespace grafana  --key xx.key --cert xx.pem

七、k8s集群接入私有镜像仓库

1. 修改hosts指定映射关系(需在k8s 所有工作节点修改)
sudo vim /etc/hosts
192.168.1.1 hub.wds.com

2. containerd 设置为跳过tls认证(需在k8s 所有工作节点修改)
若私有仓库无证书或证书不可靠 需要执行此步骤

sudo vi /etc/containerd/config.toml
      [plugins."io.containerd.grpc.v1.cri".registry.configs]
        [plugins."io.containerd.grpc.v1.cri".registry.configs."hub.wds.com".tls]
          insecure_skip_verify = true
#重启containerd
systemctl daemon-reload
sudo systemctl restart containerd

3. 在业务命名空间创建docker 账号登录的secert
kubectl -n namespace-demo create secret docker-registry demo-regcred \
 --docker-server="http://hub.wds.com" \
 --docker-username="username"  \
 --docker-password='password'

Post Directory

扫码关注公众号:暂无公众号
发送 290992
即可立即永久解锁本站全部文章