14、kubeadm流程与组件解析

Kubernetes学习目录

1、梳理基本流程

1.1、Master节点启动相关流程

1、当前环境检查,确保当前主机可以部署kubernetes
2、生成kubernetes对外提供服务所需要的各种私钥以及数字证书
3、生成kubernetes控制组件的kubeconfig文件
4、生成kubernetes控制组件的pod对象需要的manifest文件
5、为集群控制节点添加相关的标识,不让主节点参与node角色工作【即打上污点】
6、生成集群的统一认证的token信息,方便其他节点加入到当前的集群
7、进行基于TLS的安全引导相关的配置、角色策略、签名请求、自动配置策略
8、为集群安装coreDNS、kube-porxy、dashboard、flannel等插件。

1.2、node节点加入流程

1、当前环境检查,读取相关集群配置信息。
2、获取集群相关数据后启动kubelet服务。
3、获取认证信息后,基于证书方式进行通信。

2、流程解析

2.1、Master流程解析

2.1.1、当前环境检查,确保当前主机可以部署kubernetes

主要检查系统环境是否符合安装。

如:
1、对于交换分区的检查报错,可以通过 --ignore-preflight-errors=Swap 省略检查。

2.1.2、生成kubernetes对外提供服务所需要的各种私钥以及数字证书

[root@master3 ~]# ls /etc/kubernetes/pki/
apiserver.crt              apiserver.key                 ca.crt  front-proxy-ca.crt      front-proxy-client.key
apiserver-etcd-client.crt  apiserver-kubelet-client.crt  ca.key  front-proxy-ca.key      sa.key
apiserver-etcd-client.key  apiserver-kubelet-client.key  etcd    front-proxy-client.crt  sa.pub

2.1.3、生成kubernetes控制组件的kubeconfig文件及相关的启动配置文件

[root@master3 ~]# ls /etc/kubernetes
admin.conf  controller-manager.conf  kubelet.conf  manifests  pki  scheduler.conf

2.1.4、kubelet采集的属性信息

[root@master3 ~]# cat /var/lib/kubelet/config.yaml 
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 0s
    enabled: true
  x509:
    clientCAFile: /etc/kubernetes/pki/ca.crt
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 0s
    cacheUnauthorizedTTL: 0s
cgroupDriver: systemd
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
cpuManagerReconcilePeriod: 0s
evictionPressureTransitionPeriod: 0s
fileCheckFrequency: 0s
healthzBindAddress: 127.0.0.1
healthzPort: 10248
httpCheckFrequency: 0s
imageMinimumGCAge: 0s
kind: KubeletConfiguration
logging:
  flushFrequency: 0
  options:
    json:
      infoBufferSize: "0"
  verbosity: 0
memorySwap: {}
nodeStatusReportFrequency: 0s
nodeStatusUpdateFrequency: 0s
rotateCertificates: true
runtimeRequestTimeout: 0s
shutdownGracePeriod: 0s
shutdownGracePeriodCriticalPods: 0s
staticPodPath: /etc/kubernetes/manifests
streamingConnectionIdleTimeout: 0s
syncFrequency: 0s
volumeStatsAggPeriod: 0s
/var/lib/kubelet/config.yaml

2.1.5、kubeadm的启动参数

[root@master3 ~]# cat /var/lib/kubelet/kubeadm-flags.env 
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock 
--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8
"

2.1.6、生成kubernetes控制组件的pod对象需要的manifest文件

# 配置信息的目录
[root@master3 ~]# ls /etc/kubernetes/manifests/
etcd.yaml  kube-apiserver.yaml  kube-controller-manager.yaml  kube-scheduler.yaml

# 查看配置信息
[root@master1 ~]# kubectl get configmaps -n kube-system  | grep kubelet
kubelet-config                       1      21h

# 查看配置的位置
[root@master1 ~]# kubectl describe configmaps kubelet-config -n kube-system | grep static
staticPodPath: /etc/kubernetes/manifests

2.1.7、对etcd查询数据

# 进入etcd pods里面
kubectl -n kube-system exec -it etcd-master1 /bin/sh


# 设置链接的别名
alias etcdctl='etcdctl \
--key=/etc/kubernetes/pki/etcd/server.key \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--endpoints 192.168.10.26:2379,192.168.10.27:2379,192.168.10.28:2379'


# 查询etcd成员
sh-5.1# etcdctl -w table member list
+------------------+---------+---------+----------------------------+----------------------------+------------+
|        ID        | STATUS  |  NAME   |         PEER ADDRS         |        CLIENT ADDRS        | IS LEARNER |
+------------------+---------+---------+----------------------------+----------------------------+------------+
| 49a8f24b174de1fa | started | master2 | https://192.168.10.27:2380 | https://192.168.10.27:2379 |      false |
| 4a182a6f514944cc | started | master1 | https://192.168.10.26:2380 | https://192.168.10.26:2379 |      false |
| fe67d236c75cf789 | started | master3 | https://192.168.10.28:2380 | https://192.168.10.28:2379 |      false |
+------------------+---------+---------+----------------------------+----------------------------+------------+

# 查询etcd点的状态
sh-5.1# etcdctl -w table endpoint status
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|      ENDPOINT      |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| 192.168.10.26:2379 | 4a182a6f514944cc |   3.5.6 |  3.4 MB |     false |      false |         8 |     114792 |             114792 |        |
| 192.168.10.27:2379 | 49a8f24b174de1fa |   3.5.6 |  3.3 MB |     false |      false |         8 |     114792 |             114792 |        |
| 192.168.10.28:2379 | fe67d236c75cf789 |   3.5.6 |  3.4 MB |      true |      false |         8 |     114792 |             114792 |        |
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+

# 查询configmaps的相关名字
sh-5.1# etcdctl get /registry/configmaps/kube-system/ --prefix=true --keys-only
/registry/configmaps/kube-system/coredns
/registry/configmaps/kube-system/extension-apiserver-authentication
/registry/configmaps/kube-system/kube-flannel-cfg
/registry/configmaps/kube-system/kube-proxy
/registry/configmaps/kube-system/kube-root-ca.crt
/registry/configmaps/kube-system/kubeadm-config
/registry/configmaps/kube-system/kubelet-config

2.1.8、为集群控制节点添加相关的标识,不让主节点参与node角色工作

[root@master1 ~]# kubectl get nodes
NAME      STATUS   ROLES           AGE   VERSION
master1   Ready    control-plane   21h   v1.25.7
master2   Ready    control-plane   21h   v1.25.7
master3   Ready    control-plane   21h   v1.25.7
node1     Ready    <none>          20h   v1.25.7
node2     Ready    <none>          20h   v1.25.7

[root@master1 ~]# kubectl describe nodes | grep -i taint
Taints:             node-role.kubernetes.io/control-plane:NoSchedule
Taints:             node-role.kubernetes.io/control-plane:NoSchedule
Taints:             node-role.kubernetes.io/control-plane:NoSchedule
Taints:             <none>
Taints:             <none>

2.1.9、生成集群的统一认证的token信息,方便其他节点加入到当前的集群

[root@master1 ~]# kubeadm token list
TOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
60gie1.innb6kpy6e4cp6lk   3h          2023-03-17T12:52:42Z   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
ty35j9.vh29s063rqey0c2r   2h          2023-03-17T12:07:10Z   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token

2.1.10、进行基于TLS的安全引导相关的配置、角色策略、签名请求、自动配置策略

# 查看角色相关信息
[root@master2 ~]# kubectl get role -n kube-system
NAME                                             CREATED AT
extension-apiserver-authentication-reader        2023-03-16T12:07:00Z
kube-proxy                                       2023-03-16T12:07:10Z
kubeadm:kubelet-config                           2023-03-16T12:07:08Z
kubeadm:nodes-kubeadm-config                     2023-03-16T12:07:08Z
system::leader-locking-kube-controller-manager   2023-03-16T12:07:00Z
system::leader-locking-kube-scheduler            2023-03-16T12:07:00Z
system:controller:bootstrap-signer               2023-03-16T12:07:00Z
system:controller:cloud-provider                 2023-03-16T12:07:00Z
system:controller:token-cleaner                  2023-03-16T12:07:00Z

[root@master2 ~]# cat /etc/kubernetes/kubelet.conf 
apiVersion: v1
clusters:
    ...

2.1.11、为集群安装DNS和kube-porxy插件

[root@master1 ~]# kubectl get pod -n kube-system | egrep 'proxy|core'
coredns-75c9cf9bd7-qcwcf          1/1     Running   0             21h
coredns-75c9cf9bd7-sdsq5          1/1     Running   0             21h
kube-proxy-kmw24                  1/1     Running   0             21h
kube-proxy-lmsts                  1/1     Running   0             21h
kube-proxy-t7n6h                  1/1     Running   0             20h
kube-proxy-tgzrs                  1/1     Running   0             21h
kube-proxy-zszhv                  1/1     Running   0             20h

2.2、Node流程解析

2.2.1、当前环境检查,读取相关集群配置信息

kubeadm join vip.k8test.com:6443 --token ci73xv.kp35on7vpn75adh4 \
      --discovery-token-ca-cert-hash sha256:7f70fccc24d51c0f7a845258204c7fb0a25ed4a029d419d4535728dc2346632a 

  [root@master1 ~]# kubectl -n kube-system get cm kubeadm-config -o yaml # 查询kubeadm配置信息

2.2.2、获取集群相关数据后启动kubelet服务

[root@master1 ~]# ls /var/lib/kubelet/
config.yaml        device-plugins     memory_manager_state  plugins           pod-resources
cpu_manager_state  kubeadm-flags.env  pki                   plugins_registry  pods

2.2.3、获取认证信息后,基于证书方式进行通信

# 加入集群时有提示

3、组件解析

3.1、组件结构

3.1.1、基本组件结构图

3.1.2、组件存活查询的介绍

 生产中,当Node节点满足上面三个组件的正常运行,默认kubelet会自动向master注册自己,这样
Node节点就可以动态而且自动的添加到Kubernetes集群中,同时会定时向master汇报自己当前的状态,以
维持整个集群的正常运行。然后kubelet接收从apiserver传递过来的任务并在本地执行。
 
 默认情况下,k8s集群关于节点的控制,是通过 Node Controller 来进行统一管理的。原则上,每
10s 节点上的kubelet将本地节点的状态信息发送给master上,如果超过4次master节点没有收到
kubelet发送的节点状态信息,master就会将当前节点置为NotReady状态。
 由于每次传递的状态信息非常多,所以每10s传递一次数据信息的话,导致资源浪费严重。k8s 1.13版
本之后,引入了与节点配套使用的资源对象 -- 节点租约。

# 查询节点状态
[root@master1 ~]# kubectl get ns
NAME                   STATUS   AGE
default                Active   22h
kube-flannel           Active   21h
kube-node-lease        Active   22h
kube-public            Active   22h
kube-system            Active   22h
kubernetes-dashboard   Active   140m

# 查询节点状态和详细信息
[root@master1 ~]# kubectl get nodes
NAME      STATUS   ROLES           AGE   VERSION
master1   Ready    control-plane   22h   v1.25.7
master2   Ready    control-plane   21h   v1.25.7
master3   Ready    control-plane   21h   v1.25.7
node1     Ready    <none>          21h   v1.25.7
node2     Ready    <none>          21h   v1.25.7

租约原理
 1、kubelet仍然每10s向master节点的apiserver同步一下节点状态只不过更新的是租约的有效期限,租约的同步间隔默认是 40s。
 2、默认采集到的信息保持到租约对象中。
 3、一旦租约存储的数据发生改变的时候 或者 每5分钟才会将node的status信息上报给master节点

3.1.3、组件基本流程图

 

3.1.4、CNI、CSI、CRI术语介绍

kubernetes的设计初衷是支持可插拔架构,从而利于扩展kubernetes的功能。在此架构思想下,
kubernetes提供了3个特定功能的接口,分别是容器网络接口CNI、容器运行时接口CRI和容器存储接口
CSI。kubernetes通过调用这几个接口,来完成相应的功能。
1、CNI
- Container Network Interface kubernetes 对于网络的解决方案,只是预留了网络接口,只要符合CNI标准的解决方案都可以使用
2、CSI
- Container Storage Interface kubernetes 对于存储的解决方案,只是预留了存储接口,只要符合CSI标准的解决方案都可以使用
3、CRI
- Container Runtime Interface kubernetes 对于容器的解决方案,只是预留了容器接口,只要符合CRI标准的解决方案都可以使用

3.1.5、集群节点运行的基本逻辑图

 

 

3.2、组件间的通信

3.2.1、组件间通信流程图

 

三套CA机制介绍
etcd-ca        ETCD集群内部的 TLS 通信
kubernetes-ca  kubernetes集群内部节点间的双向 TLS 通信
front-proxy-ca Kubernetes集群与外部扩展服务简单双向 TLS 通信

3.3、kubeadm集群结构图

 

两个参数区分好的

物理主机网络
1、svc网络    --service-cidr=10.96.0.0/12
2、pods网络   --pod-network-cidr=10.244.0.0/16

3.4、企业内dns解决方案

3.4.1、DNS流程图

3.4.2、DNS对应的解析方案

CoreDNS 
 kubernetes集群内部的pod资源的主机名解析

内网DNS  
 项目网站架构内部的主机名解析

公网DNS
 项目依赖的第三方地址的域名解析

 

posted @ 2023-03-17 18:44  小粉优化大师  阅读(116)  评论(0编辑  收藏  举报