Kubernetes_APIServer_证书_03_四个静态Pod Yaml文件解析

news2024/12/31 6:16:31

文章目录

  • 前言
  • 一、APIServer Yaml文件解析
    • APIServer证书文件
    • APIServer三种探针
      • 启动探针
      • 可读性探针
      • 生存性探针
    • APIServer其他参数
    • APIServer其他配置项
  • 二、Scheduler Yaml文件解析
    • Scheduler证书配置
    • Scheduler两个探针
      • 启动探针
      • 生存性探针
    • Scheduler其他参数
    • Scheduler其他配置项
  • 三、Controller-Manager Yaml文件解析
    • Controller-Manager 证书配置
    • Controller-Manager 两种探针
      • 启动探针
      • 生存性探针
    • Controller-Manager其他参数
    • Controller-Manager其他配置项
  • 四、Etcd Yaml文件解析
    • Etcd证书文件
    • Etcd两种探针
      • 启动探针
      • 生存性探针
    • Etcd其他参数
    • Etcd其他配置项
    • Etcd 进程
  • 尾声

前言

kubectl get nodes 可以看到node有不同的role,一种是master,一种是node,role类型为master就是主节点,有四个静态Pod

一、APIServer Yaml文件解析

/etc/kubernetes/manifest/kube-apiserver.yaml 文件运行成为 apiserver 这个 Pod

整个文件 = apiVersion + kind + metadata + spec

结构和功能相适应:
apiserver的功能:

apiVersion: v1 
kind: Pod      # 类型是Pod,而不是控制器controller,所以副本数就是一个
metadata:
  annotations:
    kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 192.168.100.155:6443
  creationTimestamp: null
  labels:
    component: kube-apiserver
    tier: control-plane
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-apiserver
    - --advertise-address=192.168.100.155
    - --allow-privileged=true 
    - --authorization-mode=Node,RBAC   # 使用 rbac 授权
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
    - --enable-admission-plugins=NodeRestriction  # 准入控制器
    - --enable-bootstrap-token-auth=true
    - --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
    - --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
    - --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
    - --etcd-servers=https://127.0.0.1:2379   # apiserver需要的访问的etcd的地址(如果etcd不运行或连不上,apiserver也启动不了)
    - --insecure-port=0    
    - --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt
    - --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key
    - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
    - --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
    - --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key
    - --requestheader-allowed-names=front-proxy-client
    - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
    - --requestheader-extra-headers-prefix=X-Remote-Extra-
    - --requestheader-group-headers=X-Remote-Group
    - --requestheader-username-headers=X-Remote-User
    - --secure-port=6443   
    - --service-account-issuer=https://kubernetes.default.svc.cluster.local
    - --service-account-key-file=/etc/kubernetes/pki/sa.pub
    - --service-account-signing-key-file=/etc/kubernetes/pki/sa.key
    - --service-cluster-ip-range=10.96.0.0/12    # service子网段,这个是
    - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
    - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
    image: k8s.gcr.io/kube-apiserver:v1.21.0   # 镜像
    imagePullPolicy: IfNotPresent  # 镜像拉取策略,如果本地不存在就拉取  IfNotPresent Always Never
    livenessProbe:      # 生存性探针(生存性探针和可读性探针整个过程中运行,启动探针仅仅启动的时候用到)
      failureThreshold: 8
      httpGet:
        host: 192.168.100.155
        path: /livez
        port: 6443
        scheme: HTTPS
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    name: kube-apiserver   # pod的名称
    readinessProbe:    # 可读性探针(生存性探针和可读性探针整个过程中运行,启动探针仅仅启动的时候用到)
      failureThreshold: 3
      httpGet:
        host: 192.168.100.155
        path: /readyz
        port: 6443
        scheme: HTTPS
      periodSeconds: 1
      timeoutSeconds: 15
    resources:   # 资源请求量,request下限,limit上限,scheduler根据request对比机器上的free来调度,hpa根据 top metrics 自动扩缩容
      requests:
        cpu: 250m
    startupProbe:   # 启动探针(生存性探针和可读性探针整个过程中运行,启动探针仅仅启动的时候用到)  
      failureThreshold: 24
      httpGet:
        host: 192.168.100.155
        path: /livez
        port: 6443
        scheme: HTTPS
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    volumeMounts:  # 目录挂载
    - mountPath: /etc/ssl/certs
      name: ca-certs
      readOnly: true
    - mountPath: /etc/pki
      name: etc-pki
      readOnly: true
    - mountPath: /etc/kubernetes/pki   # 所有的证书,都从宿主机读入到apiserver容器里面去
      name: k8s-certs
      readOnly: true
  hostNetwork: true   
  priorityClassName: system-node-critical
  volumes:
  - hostPath:
      path: /etc/ssl/certs   #  这个目录不存在
      type: DirectoryOrCreate
    name: ca-certs
  - hostPath:
      path: /etc/pki     #  这个目录不存在
      type: DirectoryOrCreate
    name: etc-pki
  - hostPath:
      path: /etc/kubernetes/pki   #  这个目录存在,所有的证书,都从宿主机读入到apiserver容器里面去
      type: DirectoryOrCreate
    name: k8s-certs
status: {}

APIServer证书文件

对于apisever的所有arg参数来说,证书占了很多一部分,看一下和apiserver相关的所有证书(结构和功能相适应的原则)

通过磁盘映射将宿主机m 的 /etc/kubernetes/pki 下面的所有证书文件,映射到容器里面去了,看一下所有的证书相关的 arg 参数

cat /etc/kubernetes/manifests/kube-apiserver.yaml  # 所需要在证书都在 /etc/kubernetes/pki 目录下

# client-ca-file用于验证客户端证书,集群里用的ca是同一个,才不用为不同组件配置不同ca
- --client-ca-file=/etc/kubernetes/pki/ca.crt
- --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt  # 用来生成apiserver访问etcd的密钥和证书

- --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt # apiserver访问etcd的证书
- --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key # apiserver访问etcd的密钥

- --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt # apiserver访问kubelet的证书
- --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key # apiserver访问kubelet的密钥

- --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt  # 代理根证书签发的客户端证书
- --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key  # 代理根证书签发的客户端密钥
- --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt  # 代理根证书

- --service-account-key-file=/etc/kubernetes/pki/sa.pub  # sa公钥
- --service-account-signing-key-file=/etc/kubernetes/pki/sa.key  # sa私钥

- --tls-cert-file=/etc/kubernetes/pki/apiserver.crt  # apiserver证书
- --tls-private-key-file=/etc/kubernetes/pki/apiserver.key # apiserver密钥

这些证书都是在宿主机 /etc/kubernetes/pki 目录下,是通过 volumeMount 挂盘的方式映射到容器里面,然后 apiserver 启动的时候才可以使用的

    volumeMounts:  # 容器目录
    - mountPath: /etc/ssl/certs
      name: ca-certs
      readOnly: true
    - mountPath: /etc/pki
      name: etc-pki
      readOnly: true
    - mountPath: /etc/kubernetes/pki   # 所有的证书,都从宿主机读入到apiserver容器里面去
      name: k8s-certs
      readOnly: true
  volumes: # 宿主机目录
  - hostPath:
      path: /etc/ssl/certs   #  这个目录是linux机器的ssl认证 (http+ssl/tls=https)
      type: DirectoryOrCreate
    name: ca-certs
  - hostPath:
      path: /etc/pki     #  这个目录是linux机器的证书
      type: DirectoryOrCreate
    name: etc-pki
  - hostPath:
      path: /etc/kubernetes/pki   #  这个目录存在,所有的证书,都从宿主机读入到apiserver容器里面去
      type: DirectoryOrCreate
    name: k8s-certs

在linux中与CA相关的信息在/etc/pki目录下,里面有CA,nssdb,rpm-gpg,tls 目录。其中,CA目录就是我们在当前创建CA所要依赖的目录,tls目录是openssL的配置文件存放目录,要在此文件中修改CA的相对路径为绝对路径。

在这里插入图片描述

APIServer三种探针

启动探针

startupProbe:   # 启动探针(生存性探针和可读性探针整个过程中运行,启动探针仅仅启动的时候用到)  
  failureThreshold: 24
  httpGet:
    host: 192.168.100.155
    path: /livez
    port: 6443
    scheme: HTTPS # 指定协议是https,因为是探针访问apiserver,需要双向认证,所以是https
  initialDelaySeconds: 10
  periodSeconds: 10
  timeoutSeconds: 15

启动探针含义解释:通过发送 https://192.168.100.155:6443/livez 来验证 apiserver 是否已经启动了,启动探针仅仅启动的时候用到

可读性探针

readinessProbe:    # 可读性探针(生存性探针和可读性探针整个过程中运行,启动探针仅仅启动的时候用到)
  failureThreshold: 3
  httpGet:
    host: 192.168.100.155
    path: /readyz
    port: 6443
    scheme: HTTPS # 指定协议是https,因为是探针访问apiserver,需要双向认证,所以是https
  periodSeconds: 1
  timeoutSeconds: 15

可读性探针含义解释:通过发送 https://192.168.100.155:6443/readyz 来验证 apiserver 是否可读,apiserver 运行时使用,如果失败,报错 unready 当前不可读,可以使用 kubectl describe pod pod-name 看到

生存性探针

livenessProbe:      # 生存性探针(生存性探针和可读性探针整个过程中运行,启动探针仅仅启动的时候用到)
  failureThreshold: 8
  httpGet:
    host: 192.168.100.155
    path: /livez
    port: 6443
    scheme: HTTPS # 指定协议是https,因为是探针访问apiserver,需要双向认证,所以是https
  initialDelaySeconds: 10
  periodSeconds: 10
  timeoutSeconds: 15

生存性探针含义解释:通过发送 https://192.168.100.155:6443/livez 来验证 apiserver 是否存活,apiserver 运行时使用,如果失败,报错 unlive 当前不可活,可以使用 kubectl describe pod pod-name 看到

APIServer其他参数

  - command:
    - kube-apiserver
    - --advertise-address=192.168.100.155
    - --allow-privileged=true 
    - --authorization-mode=Node,RBAC   # 使用 rbac 授权
    - --enable-admission-plugins=NodeRestriction  # 准入控制器
    - --enable-bootstrap-token-auth=true
    - --etcd-servers=https://127.0.0.1:2379   # apiserver需要的访问的etcd的地址(如果etcd不运行或连不上,apiserver也启动不了)
    - --insecure-port=0    
    - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
    - --requestheader-allowed-names=front-proxy-client  # 请求头
    - --requestheader-extra-headers-prefix=X-Remote-Extra-  # 请求头
    - --requestheader-group-headers=X-Remote-Group  # 请求头
    - --requestheader-username-headers=X-Remote-User  # 请求头
    - --secure-port=6443   
    - --service-account-issuer=https://kubernetes.default.svc.cluster.local
    - --service-cluster-ip-range=10.96.0.0/12    # service子网段,这个是

command 表示命令,就是镜像启动命令,执行的是 kube-apiserver 二进制文件,后面的都是这个 kube-apiserver 二进制文件的启动参数。

要想知道这些参数每个代表什么意思,可以查看 k8s 官网 K8S官网APIServer介绍

APIServer其他配置项

    resources:   # 资源请求量,request下限,limit上限,scheduler根据request对比机器上的free来调度,hpa根据 top metrics 自动扩缩容
      requests:
        cpu: 250m  # cpu:250m,表示0.25个cpu,单位是container,表示每个container请求0.25个cpu
  hostNetwork: true   
  priorityClassName: system-node-critical # 这个Pod优先调度,因为是kube-system里面的静态Pod

解释 hostNetwork: true
(1) hostNetwork: true 这种网络模式 ,相当于 docker run --net=host,采用宿主机的网络命名空间。此时,对于 IP , Pod 的 ip 为 node 节点的ip,即静态Pod;对于 Port 端口,Pod的端口需要保持不与宿主机上的port 端口发生冲突,就是Pod的端口直接映射到宿主机上面去了,需要通过 Service NodePort .
(2) dnsPolicy: ClusterFirst 等效于 hostNetwork: true && dnsPolicy: ClusterFirstWithHostNet,因为当设置了 hostNetwork:true 之后,容器不仅使用宿主机的IP、端口,还是用宿主机的DNS域名解析,dnsPolicy缺省默认值为ClusterFirst,只有在额外设置一下 dnsPolicy: ClusterFirstWithHostNet,才能让POD使用k8s的dns,dns配置在/etc/resolv.conf文件中,如果不加,pod默认使用所在宿主主机使用的DNS,这样会导致容器内不能通过 serviceName.namespace 访问k8s集群中其他 Pod

参考资料:kubernetes中的Cpu和Memory
循序渐进地学习kubernetes网络
k8s-"hostNetwork: true"网络

二、Scheduler Yaml文件解析

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    component: kube-scheduler
    tier: control-plane
  name: kube-scheduler
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-scheduler
    - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
    - --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
    - --bind-address=127.0.0.1
    - --kubeconfig=/etc/kubernetes/scheduler.conf
    - --leader-elect=true
    - --port=0
    image: k8s.gcr.io/kube-scheduler:v1.21.0
    imagePullPolicy: IfNotPresent
    livenessProbe:
      failureThreshold: 8
      httpGet:
        host: 127.0.0.1
        path: /healthz
        port: 10259
        scheme: HTTPS
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    name: kube-scheduler
    resources:
      requests:
        cpu: 100m
    startupProbe:
      failureThreshold: 24
      httpGet:
        host: 127.0.0.1
        path: /healthz
        port: 10259
        scheme: HTTPS
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    volumeMounts:
    - mountPath: /etc/kubernetes/scheduler.conf
      name: kubeconfig
      readOnly: true
  hostNetwork: true
  priorityClassName: system-node-critical
  volumes:
  - hostPath:
      path: /etc/kubernetes/scheduler.conf
      type: FileOrCreate
    name: kubeconfig
status: {}

Scheduler证书配置

kube-scheduler证书配置:scheduler唯一和其他打交道的就是 scheduler Pod 访问 APIServer,因为Scheduler是静态Pod,是稳定的,所以不需要使用 sa 访问,而是使用 scheduler.conf 这种 x509 客户端证书访问,直接使用了预生成的kubeconfig【涉及文件:/etc/kubernetes/scheduler.conf】

cat /etc/kubernetes/manifests/kube-scheduler.yaml  所需要在证书都在 /etc/kubernetes/scheduler.conf

 - command:
    - kube-scheduler
    - --kubeconfig=/etc/kubernetes/scheduler.conf  # kubeconfig就是scheduler.conf文件
    - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf  # 认证使用的kubeconfig也是scheduler.conf文件
    - --authorization-kubeconfig=/etc/kubernetes/scheduler.conf  # 授权使用的kubeconfig也是scheduler.conf文件

涉及的文件

    volumeMounts: # 容器中目录
    - mountPath: /etc/kubernetes/scheduler.conf  # 启动的时候,宿主机 -> 容器
      name: kubeconfig
      readOnly: true
  volumes: # 宿主机中目录
  - hostPath:
      path: /etc/kubernetes/scheduler.conf
      type: FileOrCreate
    name: kubeconfig

Scheduler两个探针

启动探针

startupProbe:
  failureThreshold: 24
  httpGet:
    host: 127.0.0.1
    path: /healthz
    port: 10259
    scheme: HTTPS  # 指定协议是https,因为是探针访scheduler,需要双向认证,所以是https
  initialDelaySeconds: 10
  periodSeconds: 10
  timeoutSeconds: 15

启动探针含义解释:通过发送 https://127.0.0.1:10259/health 来验证 scheduler 是否已经启动了,启动探针仅仅启动的时候用到

生存性探针

livenessProbe:
  failureThreshold: 8
  httpGet:
    host: 127.0.0.1
    path: /healthz
    port: 10259
    scheme: HTTPS   # 指定协议是https,因为是探针访scheduler,需要双向认证,所以是https
  initialDelaySeconds: 10
  periodSeconds: 10
  timeoutSeconds: 15

生存性探针含义解释:通过发送 https://127.0.0.1:10259/health 来验证 scheduler 是否存活,因为这个 探针是配置在 yaml 文件中,yaml 是容器化启动,就是访问容器内的启动进程的 10259 的 health 接口。整个探针 scheduler 运行长时间生效,如果失败,报错 unlive 当前不可活,可以使用 kubectl describe pod pod-name 看到

Scheduler其他参数

  - command:
    - kube-scheduler
    - --bind-address=127.0.0.1
    - --leader-elect=true
    - --port=0

command 表示命令,就是镜像启动命令,执行的是 kube-scheduler 二进制文件,后面的都是这个 kube-scheduler 二进制文件的启动参数。

要想知道这些参数每个代表什么意思,可以查看 k8s 官网 K8S官网Scheduler介绍

Scheduler其他配置项

    resources:
      requests:
        cpu: 100m   # 每个Container至少需要 0.1 个CPU
  hostNetwork: true  # ip为Pod所在宿主机IP,容器端口直接映射到宿主机
  priorityClassName: system-node-critical  # 这个Pod优先调度,因为是kube-system里面的静态Pod

三、Controller-Manager Yaml文件解析

[root@w1 ~]# cat /etc/kubernetes/manifests/kube-controller-manager.yaml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    component: kube-controller-manager
    tier: control-plane
  name: kube-controller-manager
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-controller-manager
    - --allocate-node-cidrs=true
    - --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
    - --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
    - --bind-address=127.0.0.1
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
    - --cluster-cidr=10.244.0.0/16
    - --cluster-name=kubernetes
    - --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
    - --cluster-signing-key-file=/etc/kubernetes/pki/ca.key
    - --controllers=*,bootstrapsigner,tokencleaner
    - --kubeconfig=/etc/kubernetes/controller-manager.conf
    - --leader-elect=true
    - --port=0
    - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
    - --root-ca-file=/etc/kubernetes/pki/ca.crt
    - --service-account-private-key-file=/etc/kubernetes/pki/sa.key
    - --service-cluster-ip-range=10.96.0.0/12
    - --use-service-account-credentials=true
    image: k8s.gcr.io/kube-controller-manager:v1.21.0
    imagePullPolicy: IfNotPresent
    livenessProbe:
      failureThreshold: 8
      httpGet:
        host: 127.0.0.1
        path: /healthz
        port: 10257
        scheme: HTTPS
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    name: kube-controller-manager
    resources:
      requests:
        cpu: 200m
    startupProbe:
      failureThreshold: 24
      httpGet:
        host: 127.0.0.1
        path: /healthz
        port: 10257
        scheme: HTTPS
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    volumeMounts:
    - mountPath: /etc/ssl/certs
      name: ca-certs
      readOnly: true
    - mountPath: /etc/pki
      name: etc-pki
      readOnly: true
    - mountPath: /usr/libexec/kubernetes/kubelet-plugins/volume/exec
      name: flexvolume-dir
    - mountPath: /etc/kubernetes/pki
      name: k8s-certs
      readOnly: true
    - mountPath: /etc/kubernetes/controller-manager.conf
      name: kubeconfig
      readOnly: true
  hostNetwork: true
  priorityClassName: system-node-critical
  volumes:
  - hostPath:
      path: /etc/ssl/certs
      type: DirectoryOrCreate
    name: ca-certs
  - hostPath:
      path: /etc/pki
      type: DirectoryOrCreate
    name: etc-pki
  - hostPath:
      path: /usr/libexec/kubernetes/kubelet-plugins/volume/exec
      type: DirectoryOrCreate
    name: flexvolume-dir
  - hostPath:
      path: /etc/kubernetes/pki
      type: DirectoryOrCreate
    name: k8s-certs
  - hostPath:
      path: /etc/kubernetes/controller-manager.conf
      type: FileOrCreate
    name: kubeconfig
status: {}

Controller-Manager 证书配置

cat /etc/kubernetes/manifests/kube-controller-manager.yaml  # 所需要在证书都在 /etc/kubernetes/controller-manager.conf

  - command:
    - kube-controller-manager
    - --kubeconfig=/etc/kubernetes/controller-manager.conf  # kubeconfig
    - --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf  # 认证使用的kubeconfig
    - --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf # 授权使用的kubeconfig

    - --root-ca-file=/etc/kubernetes/pki/ca.crt  # 根 ca 证书
    - --client-ca-file=/etc/kubernetes/pki/ca.crt # 客户端 ca 证书 

    - --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt # 集群签名证书
    - --cluster-signing-key-file=/etc/kubernetes/pki/ca.key  # 集群签名密钥

    - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt # 请求头,代理根证书
    - --service-account-private-key-file=/etc/kubernetes/pki/sa.key  # control-manager使用sa.key,kube-apiserver使用sa.pub

controller-manager.conf文件: controller-manager用来访问apiserver,内容包括 client.crt client.key
sa.key文件:

涉及的文件

    volumeMounts: # 容器目录
    - mountPath: /etc/ssl/certs  # 步骤5:这个目录是linux机器的ssl认证 (http+ssl/tls=https)
      name: ca-certs
      readOnly: true
    - mountPath: /etc/pki   # 步骤4:这个目录是linux机器的证书
      name: etc-pki
      readOnly: true
    - mountPath: /usr/libexec/kubernetes/kubelet-plugins/volume/exec # 步骤3:宿主机->容器,/nodeagent~uds/uds文件
      name: flexvolume-dir
    - mountPath: /etc/kubernetes/pki  # 步骤2:宿主机 -> 容器
      name: k8s-certs
      readOnly: true
    - mountPath: /etc/kubernetes/controller-manager.conf  # 步骤1:宿主机 -> 容器, controller-manager访问apiserver
      name: kubeconfig
      readOnly: true
  volumes: # 宿主机目录
  - hostPath:
      path: /etc/ssl/certs
      type: DirectoryOrCreate
    name: ca-certs
  - hostPath:
      path: /etc/pki   
      type: DirectoryOrCreate
    name: etc-pki
  - hostPath:
      path: /usr/libexec/kubernetes/kubelet-plugins/volume/exec
      type: DirectoryOrCreate
    name: flexvolume-dir
  - hostPath:
      path: /etc/kubernetes/pki
      type: DirectoryOrCreate
    name: k8s-certs
  - hostPath:
      path: /etc/kubernetes/controller-manager.conf
      type: FileOrCreate
    name: kubeconfig

Controller-Manager 两种探针

启动探针

startupProbe:
  failureThreshold: 24
  httpGet:
    host: 127.0.0.1
    path: /healthz
    port: 10257
    scheme: HTTPS # 
  initialDelaySeconds: 10
  periodSeconds: 10
  timeoutSeconds: 15

启动探针含义解释:通过发送 https://127.0.0.1:10257/health 来验证 controller-manager 是否已经启动了,启动探针仅仅启动的时候用到

生存性探针

livenessProbe:
  failureThreshold: 8
  httpGet:
    host: 127.0.0.1
    path: /healthz
    port: 10257
    scheme: HTTPS # 
  initialDelaySeconds: 10
  periodSeconds: 10
  timeoutSeconds: 15

生存性探针含义解释:通过发送 https://127.0.0.1:10257/health 来验证 controller-manager 是否存活,因为这个 探针是配置在 yaml 文件中,yaml 是容器化启动,就是访问容器内的启动进程的 10257 的 health 接口。整个探针 controller-manager 运行长时间生效,如果失败,报错 unlive 当前不可活,可以使用 kubectl describe pod pod-name 看到

Controller-Manager其他参数

  - command:
    - kube-controller-manager
    - --allocate-node-cidrs=true
    - --bind-address=127.0.0.1
    - --cluster-cidr=10.244.0.0/16
    - --cluster-name=kubernetes
    - --controllers=*,bootstrapsigner,tokencleaner
    - --leader-elect=true
    - --port=0
    - --service-cluster-ip-range=10.96.0.0/12
    - --use-service-account-credentials=true

command 表示命令,就是镜像启动命令,执行的是 kube-controller-manager 二进制文件,后面的都是这个 kube-controller-manager 二进制文件的启动参数。

要想知道这些参数每个代表什么意思,可以查看 k8s 官网 K8S官网ControllerManager介绍

Controller-Manager其他配置项

    name: kube-controller-manager
    resources:
      requests:
        cpu: 200m   # 每个Container至少需要 0.2 个CPU
  hostNetwork: true   # ip为Pod所在宿主机IP,容器端口直接映射到宿主机
  priorityClassName: system-node-critical  # 这个Pod优先调度,因为是kube-system里面的静态Pod

四、Etcd Yaml文件解析

Etcd证书文件

Etcd 组件两个数据交互:
(1) Etcd对外提供服务,其实就是 Kube-APIserver访问Etcd, 要有一套etcd server证书和apiserver访问etcd的客户端证书 【涉及文件:etcd server.key server.crt,apiserver 的 apiserver-etcd-client.key 和 apiserver-etcd-client.crt 】
(2) Etcd各主节点之间进行通信,要有一套etcd peer证书 【涉及文件:peer.key peer.crt 】

cat /etc/kubernetes/manifests/etcd.yaml  所需要在证书都在 /etc/kubernetes/pki/etcd 目录下

  - command:
    - etcd
    - --cert-file=/etc/kubernetes/pki/etcd/server.crt  # etcd唯一的对外提供服务, apiserver访问etcd
    - --key-file=/etc/kubernetes/pki/etcd/server.key # etcd唯一的对外提供服务, apiserver访问etcd
    - --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt # # 用来验证etcd服务端证书的ca证书

    - --peer-client-cert-auth=true  # etcd各主节点之间相互通信 true
    - --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt  # etcd各主节点之间相互通信
    - --peer-key-file=/etc/kubernetes/pki/etcd/peer.key  # etcd各主节点之间相互通信
    - --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt  # 用来验证etcd各主节点之间相互通信证书的ca证书 peer.key peer.crt

涉及的文件

    volumeMounts:
    - mountPath: /var/lib/etcd   # 步骤2:运行过程中,将 etcd 的数据持久化到磁盘
      name: etcd-data
    - mountPath: /etc/kubernetes/pki/etcd   # 步骤1:启动的时候,将etcd需要的证书刷入的容器里
      name: etcd-certs
  volumes:
  - hostPath:
      path: /etc/kubernetes/pki/etcd
      type: DirectoryOrCreate
    name: etcd-certs
  - hostPath:
      path: /var/lib/etcd
      type: DirectoryOrCreate
    name: etcd-data

Etcd两种探针

启动探针

startupProbe:
  failureThreshold: 24
  httpGet:
    host: 127.0.0.1
    path: /health
    port: 2381
    scheme: HTTP  # 指定协议为http,自己访问自己 127.0.0.1,这里不是 https 了
  initialDelaySeconds: 10
  periodSeconds: 10
  timeoutSeconds: 15

启动探针含义解释:通过发送 http://127.0.0.1:2381/health 来验证 etcd 是否已经启动了,启动探针仅仅启动的时候用到

生存性探针

livenessProbe:
  failureThreshold: 8
  httpGet:
    host: 127.0.0.1
    path: /health
    port: 2381
    scheme: HTTP  # 指定协议为http,自己访问自己 127.0.0.1,这里不是 https 了
  initialDelaySeconds: 10
  periodSeconds: 10
  timeoutSeconds: 15

生存性探针含义解释:通过发送 http://127.0.0.1:2381/health 来验证 etcd 是否存活,因为这个 探针是配置在 yaml 文件中,yaml 是容器化启动,就是访问容器内的启动进程的 2381 的 health 接口。整个探针 etcd 运行长时间生效,如果失败,报错 unlive 当前不可活,可以使用 kubectl describe pod pod-name 看到

Etcd其他参数

  - command:   # 启动命令
    - etcd  # 二进制文件
    - --advertise-client-urls=https://192.168.100.151:2379
    - --client-cert-auth=true
    - --data-dir=/var/lib/etcd
    - --initial-advertise-peer-urls=https://192.168.100.151:2380
    - --initial-cluster=w1=https://192.168.100.151:2380
    - --listen-client-urls=https://127.0.0.1:2379,https://192.168.100.151:2379
    - --listen-metrics-urls=http://127.0.0.1:2381
    - --listen-peer-urls=https://192.168.100.151:2380
    - --name=w1
    - --snapshot-count=10000

command 表示命令,就是镜像启动命令,执行的是 etcd 二进制文件,后面的都是这个 etcd 二进制文件的启动参数。

要想知道这些参数每个代表什么意思,可以查看 k8s 官网

Etcd其他配置项

    name: etcd
    resources:  # 资源
      requests: # 下限
        cpu: 100m   # 每个Container至少需要 0.1 个CPU
        ephemeral-storage: 100Mi  # 每个container至少100Mi磁盘        memory: 100Mi   # 内存为100M
  hostNetwork: true  # ip为Pod所在宿主机IP,容器端口直接映射到宿主机
  priorityClassName: system-node-critical # 这个Pod优先调度,因为是kube-system里面的静态Pod

ephemeral-storage: 100Mi

每个container至少100Mi磁盘,因为etcd是分布式数据库,存储configmap和secret 到 /var/lib/etcd 目录 ,存储会被持久化到宿主机,所以需要定义一个磁盘空间下限,其他三个 apiserver scheduler kube-controller-manager 都是因为不需要存储数据,所以不定义磁盘空间

参考资料:ephemeral-storage 介绍

Etcd 进程

上面是 etcd 的证书,我们现在来看一下 etcd 的进程, etcd 作为四个静态Pod之一,是运行在 master 节点之上的,我们在 master 节点的宿主机上执行 ps -ef | grep etcd,如下:

在这里插入图片描述

如上图,执行 ps -ef | grep etcd 之后,打印出来不止一条,其中有些不是etcd的,只是包含 etcd 关键字,解释一下找到的四条包含 etcd 关键字的进程:
第一个是 etcd Pod Container对应的进程 (只有这条是 etcd 进程本身),
第二个是 apiserver Pod Container对应的进程,
第三个是 kuboard Pod Container对应的进程,
第四个就是 ps -ef|grep etcd 这行命令本身。

知识点(上图中四行输出怎么看出来的):
(1) 对于 k8s Pod Container 容器化程序启动的,使用 ps -ef 也是可以在Pod 所在 linux 上看到yaml里面的参数和启动命令,至于到底是哪个,直接查看输出的 CMD 列第一个二进制文件名或者最后一个 xxx.yaml 名基本就可以判断出了
(2) ps -ef|grep xxx 查看到的结果,其中有一个就是 ps -ef | grep xxx 这条命令本身

尾声

对于四个静态Pod,每个静态Pod,分别介绍了 证书和组件交互、探针、其他参数、其他配置项。

证书方面:基本是按照 k8s 内部组件交互图来的

探针方面:除了apiserver使用 192.168.100.151 宿主机上的 6443 为探针,其他三个静态Pod都使用自己访问自己 127.0.0.1:port/health 作为探针.

其他参数方面:基本查看 k8s 官网就可以了,见 组件工具

在这里插入图片描述

其他配置项方面:
(1) 资源下限方面,只有 etcd 为了给宿主机持久化 /var/lib/etcd 目录下的数据,对磁盘做了下限要求,其他三个静态Pod仅仅对cpu和内存要求
(2) hostNetwork: true 表示Pod IP使用宿主机IP, 端口直接映射到Pod所在宿主机的端口,DNS也是使用宿主机的DNS解析,为了让能够同时解析 serviceName.ns d需要设置为 dnsPolicy: ClusterFirstWithHost
(3) priorityClassName: system-node-critical 将四个静态Pod都设置为优先调度,因为是kube-system里面的静态Pod

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/609027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测试各种变量是否是线程安全的

前提条件,把这个类设成是单例模式,也就是说,这个类只能创建一个对象,然后多个线程在一个对象中去争抢资源. 1.int类型的成员变量number, (private int number) 线程共享 public class Stu {private int number;private String age;private String math;private i…

【sentinel】漏桶算法在Sentinel中的应用

漏桶算法 漏桶算法介绍 漏桶算法,又称leaky bucket。 从图中我们可以看到,整个算法其实十分简单。首先,我们有一个固定容量的桶,有水流进来,也有水流出去。对于流进来的水来说,我们无法预计一共有多少水…

内存池技术

为了学习池化技术以及后续自行实现一个仿tcmalloc的线程池,我们先浅浅的学习一下池化的概念,以及简单的实现一个定长的内存池。 文章目录 一:池化技术二:内存池三:内存池主要解决的问题四:malloc五&#x…

原地顺时针旋转矩阵(leetcode 48.选择图像)

本题目在leetcode上有原题48. 旋转图像 详细讲解 顺时针旋转90,横变竖,竖变横。按圈分解,一圈圈的单独转,由外圈到内圈,不断分解。 每一圈转到位了,整个矩阵就旋转好了。 那么,问题来了&…

Photoshop史上最强更新,动动手指就能让AI替你修图

Photoshop 在最新的 Beta 版本中,融入了 Firely 智能 AI 创意填充功能,只要对图片进行简单地框选,就能实现生成对象、生成背景、扩展图像、移除对象以及更多创意功能,支持用自然语言输入指令,让 AI 替你完成创意填充。…

Jmeter常用的两大性能测试场景你都知道吗?

目录 一、阶梯式场景 二、波浪式场景 一、阶梯式场景 该场景主要应用在负载测试里面,通过设定一定的并发线程数,给定加压规则,遵循“缓起步,快结束”的原则,不断地增加并发用户来找到系统的性能瓶颈,进而有…

SpringCloud:分布式缓存之Redis分片集群

1.搭建分片集群 主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决: 海量数据存储问题 高并发写的问题 使用分片集群可以解决上述问题,如图: 分片集群特征: 集群中有多个master,每个master保存不同数据 …

管道通信详解

目录 一、进程通信原理 二、什么是管道 三、创建一个匿名管道 四、fork共享管道的原理 五、管道的特点 六、4中场景 七、命名管道 八、命名管道通信的原理 九、创建一个命名管道 十、上实例 一、进程通信原理 我们知道进程间相互独立,具有独立性。那么我们…

编译原理 SLR(1) 语法分析器的构建

编译原理 SLR(1) 语法分析器的构建 在我的博客查看:https://chenhaotian.top/study/compilation-principle-slr1/ 实验三 自底向上语法分析器的构建 项目代码:https://github.com/chen2438/zstu-study/tree/main/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%8…

冈萨雷斯DIP第10章知识点

文章目录 10.2 点、线和边缘检测10.2.2 孤立点的检测10.2.3 线检测10.2.4 边缘模型 10.3 阈值处理10.3.4 使用图像平滑改进全局阈值处理10.3.5 使用边缘改进全局阈值处理10.4 使用区域生长、区域分离与聚合进行分割 分割依据的灰度值基本性质是:不连续性和相似性。本…

计算机网络第二章——物理层(下)

提示:君子可内敛不可懦弱,面不公可起而论之 文章目录 2.1.7 数据交换方式为什么要进行数据交换数据交换的方式电路交换电路交换的优缺点报文交换报文交换的优缺分组交换分组交换的优缺点数据交换方式的选择数据报方式虚电路方式虚电路方式的特点数据报VS…

HJ29 字符串加解密

描述 对输入的字符串进行加解密,并输出。 加密方法为: 当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a; 当内容是数字时则把该数字加1&#xff0c…

深入理解设计原则之依赖反转原则(DIP)【软件架构设计】

系列文章目录 C高性能优化编程系列 深入理解软件架构设计系列 深入理解设计模式系列 高级C并发线程编程 DIP:依赖反转原则 系列文章目录1、依赖反转原则的定义和解读2、稳定的抽象层3、依赖倒置原则和控制反转、依赖注入的联系小结 1、依赖反转原则的定义和解读 …

多线程事务回滚方法

多线程事务回滚方法 介绍案例演示线程池配置异常类实体类控制层业务层mapper工具类验证 解决方案使用sqlSession控制手动提交事务SqlSessionTemplate注入容器中改造业务层验证成功操作示例业务层改造 介绍 1.最近有一个大数据量插入的操作入库的业务场景,需要先做一…

Matcher: Segment Anything with One Shot Using All-Purpose Feature Matching 论文精读

Matcher: Segment Anything with One Shot Using All-Purpose Feature Matching 论文链接:[2305.13310] Matcher: Segment Anything with One Shot Using All-Purpose Feature Matching (arxiv.org) 代码链接:aim-uofa/Matcher: Matcher: Segment Anyt…

STM32 HAL库开发——基础篇

目录 一、基础知识 1.1 Cortex--M系列介绍 1.2 什么是stm32 1.3 数据手册查看 1.4 最小系统和 IO 分配 1.4.1 电源电路 1.4.2 复位电路 1.4.3 BOOT 启动电路 1.4.4 晶振电路 1.4.5 下载调试电路 1.4.6 串口一键下载电路 1.4.7 IO 分配 1.4.8 总结 1.5 开发工…

Spring:Spring框架中的核心类 ③

一、解读思想 1、用轮廓解读体系。 2、关注细节,不执着细节。 二、核心类设计 1、 容器接口和实现类 ApplicationContext 接口(容器) ①.读取配置文件 ②.注解形成bean 哪种形式的bean统一核心管理使用中心类。 2、 ApplicationCont…

MySQL 子查询

文章目录 子查询单行子查询多行子查询相关子查询 exists 子查询 所谓子查询就是 select 查询语句中还有 select 查询语句,里面的称为子查询或内查询,外面的称为主查询或外查询。 根据查询结果记录数量,子查询可以分为两类: 单行…

机器学习 | 分类问题

目录 一、K近邻算法 二、决策树 1.一些原理介绍 2.决策树案例与实践 三、距离 一、K近邻算法 我们引入accuracy_score,利用score()的方法评估准确性。k近邻算法中的k是一个超参数,需要事先进行定义。 k值得选取经验做法是一般低于训练样本得平方根…

排书 dfs 迭代加深 IDA* 剪枝 java

🍑 算法题解专栏 🍑 排书 给定 n n n 本书,编号为 1 ∼ n 1 \sim n 1∼n。 在初始状态下,书是任意排列的。 在每一次操作中,可以抽取其中连续的一段,再把这段插入到其他某个位置。 我们的目标状态是把…