kubernetes运行机制及术语
master节点运行机制kube-apiserverk8s API Server提供了k8s各类资源对象(pod,RC,Service等)的增删改查及watch等HTTP Rest接口,是整个系统 的数据总线和数据中心。提供了集群管理的REST API接口(包括认证授权、数据校验以及集群状态变更);提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API
·
master节点运行机制
kube-apiserver
k8s API Server 提供了 k8s 各类资源对象( pod,RC,Service 等)的增删改查及 watch 等 HTTP Rest 接口,是整个系统 的数据总线和数据中心。提供了集群管理的 REST API 接口 ( 包括认证授权、数据校验以及集群状态变更 ) ;提供其他模块之间的数据交互和通信的枢纽(其他模块通过 API Server 查询或修改数据,只有 API Server 才直接操作 etcd) ;是资源配额控制的入口;拥有完备的集群安全机制apiserver 目前在 master 监听两个端口,通过 --insecure-port int 监听一个非安全的 127.0.0.1 本地端口 ( 默认为 8080)该端口用于接收 HTTP 请求;该端口默认值为 8080 ,可以通过 API Server 的启动参数 “--insecure-port” 的值来修改默认值;默认的 IP 地址为 “localhost” ,可以通过启动参数 “--insecure-bind-address” 的值来修改该 IP 地址;非认证或未授权的 HTTP 请求通过该端口访问 API Server(kube-controller-manager 、 kube-scheduler) 。
root@master1:/home/zzj# kube-apiserver --help | grep insecure
--address ip The IP address on which to serve the insecure --port (set to 0.0.0.0 for all IPv4 interfaces and :: for all IPv6 interfaces). (default 127.0.0.1) (DEPRECATED: see --bind-address instead.)
--insecure-bind-address ip The IP address on which to serve the --insecure-port (set to 0.0.0.0 for all IPv4 interfaces and :: for all IPv6 interfaces). (default 127.0.0.1) (DEPRECATED: This flag will be removed in a future version.)
--insecure-port int The port on which to serve unsecured, unauthenticated access. (default 8080) (DEPRECATED: This flag will be removed in a future version.)
root@master1:/home/zzj# ss -ntl
State Recv-Q Send-Q
LISTEN 0 128 127.0.0.1:8080 0.0.0.0:*
通过参数 --bind-address=192.168.7.101 监听一个对外访问且安全 (https) 的端口 ( 默认为 6443) :该端口默认值为 6443 ,可通过启动参数 “--secure-port” 的值来修改默认值;该端口用于接收客户端、 dashboard 等外部 HTTPS 请求;用于基于 Tocken 文件或客户端证书及 HTTP Base 的认证;用于基于策略的授权
以上所有参数配置都可以在 /etc/systemd/system/kube-apiserver.service进行配置
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
[Service]
ExecStart=/usr/bin/kube-apiserver \
--advertise-address=10.0.0.9 \
--allow-privileged=true \
--anonymous-auth=false \
--authorization-mode=Node,RBAC \
--bind-address=10.0.0.9 \
--client-ca-file=/etc/kubernetes/ssl/ca.pem \
--endpoint-reconciler-type=lease \
--etcd-cafile=/etc/kubernetes/ssl/ca.pem \
--etcd-certfile=/etc/kubernetes/ssl/kubernetes.pem \
--etcd-keyfile=/etc/kubernetes/ssl/kubernetes-key.pem \
--etcd-servers=https://10.0.0.6:2379 \
--kubelet-certificate-authority=/etc/kubernetes/ssl/ca.pem \
--kubelet-client-certificate=/etc/kubernetes/ssl/admin.pem \
--kubelet-client-key=/etc/kubernetes/ssl/admin-key.pem \
--kubelet-https=true \
--service-account-key-file=/etc/kubernetes/ssl/ca.pem \
--service-cluster-ip-range=10.10.0.0/16 \
--service-node-port-range=30000-60000 \
--tls-cert-file=/etc/kubernetes/ssl/kubernetes.pem \
--tls-private-key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
--requestheader-client-ca-file=/etc/kubernetes/ssl/ca.pem \
--requestheader-allowed-names= \
--requestheader-extra-headers-prefix=X-Remote-Extra- \
--requestheader-group-headers=X-Remote-Group \
--requestheader-username-headers=X-Remote-User \
--proxy-client-cert-file=/etc/kubernetes/ssl/aggregator-proxy.pem \
--proxy-client-key-file=/etc/kubernetes/ssl/aggregator-proxy-key.pem \
--enable-aggregator-routing=true \
--v=2
Restart=always
RestartSec=5
Type=notify
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
# curl 127.0.0.1:8080/apis #分组api
# curl 127.0.0.1:8080/api/v1 #带具体版本号的api
# curl 127.0.0.1:8080/ #返回核心api列表
# curl 127.0.0.1:8080/version #api 版本信息
# curl 127.0.0.1:8080/healthz/etcd #与etcd的心跳监测
# curl 127.0.0.1:8080/apis/autoscaling/v1 #api的详细信息
# curl 127.0.0.1:8080/metrics #指标数据
kube-controller-manager
Controller Manager 作为集群内部的管理控制中心,非安全默认端口 10252 ,负责集群内的 Node 、 Pod 副本、服务端点(Endpoint )、命名空间( Namespace )、服务账号( ServiceAccount )、资源定额( ResourceQuota ) 的管理,当某个Node 意外宕机时, Controller Manager 会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。
root@master1:/home/zzj# cat /etc/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
[Service]
ExecStart=/usr/bin/kube-controller-manager \
--address=127.0.0.1 \
--master=http://127.0.0.1:8080 \ #调用kube-api-server的本地端口进行通信
--allocate-node-cidrs=true \
--cluster-cidr=10.20.0.0/16 \
--cluster-name=kubernetes \
--cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem \
--cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem \
--kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \
--leader-elect=true \
--node-cidr-mask-size=24 \
--root-ca-file=/etc/kubernetes/ssl/ca.pem \
--service-account-private-key-file=/etc/kubernetes/ssl/ca-key.pem \
--service-cluster-ip-range=10.10.0.0/16 \
--use-service-account-credentials=true \
--v=2
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
kube-cheduler
Scheduler负责Pod调度,在整个系统中起"承上启下"作用,承上:负责接收Controller Manager创建的新的Pod, 为其选择一个合适的Node;启下:Node上的kubelet接管Pod的生命周期。
root@master1:/home/zzj# cat /etc/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
[Service]
ExecStart=/usr/bin/kube-scheduler \
--address=127.0.0.1 \
--master=http://127.0.0.1:8080 \ #调用kube-api-server的本地端口进行通信
--kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \
--leader-elect=true \
--v=2
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
通过调度算法为待调度 Pod 列表的每个 Pod 从可用 Node 列表中选择一个最适合的 Node ,并将信息写入 etcd 中node 节点上的 kubelet 通过 API Server(6443端口) 监听到 kubernetes Scheduler 产生的 Pod 绑定信息,然后获取对应的 Pod 清单,下载Image ,并启动容器。
node节点运行机制
kubelet
在 kubernetes 集群中,每个 Node 节点都会启动 kubelet 进程,用来处理 Master 节点下发到本节点的任务,管理 Pod和其中的容器。 kubelet 会在 API Server 上注册节点信息,定期向 Master 汇报节点资源使用情况,并通过 cAdvisor(顾问 ) 监控容器和节点资源,可以把 kubelet 理解成 Server/Agent 架构中的 agent , kubelet 是 Node 上的 pod管家。
root@master1:/home/zzj# cat /etc/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
[Service]
WorkingDirectory=/var/lib/kubelet
ExecStartPre=/bin/mount -o remount,rw '/sys/fs/cgroup'
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuset/system.slice/kubelet.service
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/hugetlb/system.slice/kubelet.service
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/memory/system.slice/kubelet.service
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/pids/system.slice/kubelet.service
ExecStart=/usr/bin/kubelet \
--config=/var/lib/kubelet/config.yaml \
--cni-bin-dir=/usr/bin \
--cni-conf-dir=/etc/cni/net.d \
--hostname-override=10.0.0.9 \
--kubeconfig=/etc/kubernetes/kubelet.kubeconfig \
--network-plugin=cni \
--pod-infra-container-image=harbor.zzj.com/baseimage/pause-amd64:3.1 \
--root-dir=/var/lib/kubelet \
--v=2
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
root@master1:/home/zzj# cat /etc/kubernetes/kubelet.kubeconfig
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1RENDQXFDZ0F3SUJBZ0lVYmVGRys2Zy9qeFBob1cvOExjMlJLc0lJQmxnd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1lURUxNQWtHQTFVRUJoTUNRMDR4RVRBUEJnTlZCQWdUQ0VoaGJtZGFhRzkxTVFzd0NRWURWUVFIRXdKWQpVekVNTUFvR0ExVUVDaE1EYXpoek1ROHdEUVlEVlFRTEV3WlRlWE4wWlcweEV6QVJCZ05WQkFNVENtdDFZbVZ5CmJtVjBaWE13SUJjTk1qRXhNakV6TURrME5UQXdXaGdQTWpFeU1URXhNVGt3T1RRMU1EQmFNR0V4Q3pBSkJnTlYKQkFZVEFrTk9NUkV3RHdZRFZRUUlFd2hJWVc1bldtaHZkVEVMTUFrR0ExVUVCeE1DV0ZNeEREQUtCZ05WQkFvVApBMnM0Y3pFUE1BMEdBMVVFQ3hNR1UzbHpkR1Z0TVJNd0VRWURWUVFERXdwcmRXSmxjbTVsZEdWek1JSUJJakFOCkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXNtVTZnbHZEcFhuc0RUaGJnQTJZQW9JcHBIbXYKb0FzSGRpclZBNEJTWldCRkQxblRsT2hOQzFZWmpMWUExYzNlb0JwZnZvQnpQRkdaV0VTS0RsaTVGQ1R4QUdmawp2UlNBcERiNWtTWU85Uy9aU2MySTExaFNJMjYxNkNpMXkwQnRSZXF4dnN6MnB1WWtoeUZiRVU1QzIyYnFRRjZ1CksrM1QxSDFNYktES25EWGg0dXdrMHBaUkY3ZDlTc3JOTmcwTVh6UVoyRmI2aHhXMEFxMXpjaTRTOFV5RXFFWW0KQ2N6c1R0cE1QVWUwTUNEaDRKNG9kRnY2R1ZQbDdYbjIzNTJZZHpBRWh0T0o5aHdCQU9FNlMwbE1ONEtpWTNMUgpYQWFCMzh5WGovY3JXcnQyWUhCc2RhRmV0b3FlMDhlVWhQY01HV0lBSldUbUpTZWRscFlYb1VXNHlRSURBUUFCCm8yWXdaREFPQmdOVkhROEJBZjhFQkFNQ0FRWXdFZ1lEVlIwVEFRSC9CQWd3QmdFQi93SUJBakFkQmdOVkhRNEUKRmdRVUJpN0cxL2hvdEpqRjQ0RjFuTEh4aHdjbXdxZ3dId1lEVlIwakJCZ3dGb0FVQmk3RzEvaG90SmpGNDRGMQpuTEh4aHdjbXdxZ3dEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBQjhYbE1YOEd3czlGenRtT3JRSlVOR2tTSzQyCmRFb0tjSE93SXNpYVhkT2F3Y2ZGRWxzditKSUp4anJ0TzRoL1RHNkx1cmZRN1QzeWx0dndOQ1BEUGFDMW5ManIKaVl1Qmh0ZXhHWGRoeHhnZGpGbkJoUWwvUVVBeVB3VngxNFZHUnhLbnM3dEg3M3BrWlhCUUR2OUwxNUlOS0ptTwozejRacFd2M1Y5Tlo5TGpjelRiK2h0bEVyRlR6aDUrUXc3YVAzbUtwc2FNU2xzL1dwRExQV01iaG9pK2g2bWxaCjRxRHhTOHV6aEwrZ0dMMUQvWTRlemF0dXAzRGpDWWVVVHdBQ2pxL0ZpdU1zZnlMemRHaTVUd29WMDVpeUN4cXgKSk5MSVNwbm1hZzhrQ1ZjN3dRU29kQ0VGcktTOEpPMzRSeUh4cGx2MG0zR3VmTkp6K21KUXVOaFp3THM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
server: https://10.0.0.9:6443
name: kubernetes
kube-proxy
kube-proxy 运行在每个节点上,监听 API Server 中服务对象的变化,再通过管理 IPtables 来实现网络的转发。Kube-Proxy 不同的版本可支持三种工作模式:UserSpacek8s v1.2 及以后就已经淘汰IPtables目前默认方式, 1.1 开始支持, 1.2 开始为默认IPVS1.9 引入到 1.11 正式版本,需要安装 ipvsadm 、 ipset 工具包和加载 ip_vs 内核模块
root@master1:/home/zzj# cat /etc/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
[Service]
# kube-proxy 根据 --cluster-cidr 判断集群内部和外部流量,指定 --cluster-cidr 或 --masquerade-all 选项后,kube-proxy 会对访问 Service IP 的请求做 SNAT
WorkingDirectory=/var/lib/kube-proxy
ExecStart=/usr/bin/kube-proxy \
--bind-address=10.0.0.9 \
--cluster-cidr=10.20.0.0/16 \
--hostname-override=10.0.0.9 \
--kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \
--logtostderr=true \
--proxy-mode=iptables
Restart=always
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
iptables
Kube-Proxy 监听 Kubernetes Master 增加和删除 Service 以及 Endpoint 的消息。对于每一个 Service , Kube Proxy 创建相应的 IPtables 规则,并将发送到 Service Cluster IP 的流量转发到 Service 后端提供服务的 Pod 的相 应端口上。注:虽然可以通过 Service 的 Cluster IP 和服务端口访问到后端 Pod 提供的服务,但该 Cluster IP 是 Ping 不通的。其原因是 Cluster IP 只是 IPtables 中的规则,并不对应到一个任何网络设备。IPVS 模式的 Cluster IP 是可以 Ping 通的。
IPVS
IPVS 相对 IPtables 效率会更高一些,使用 IPVS 模式需要在运行 Kube-Proxy 的节点上安装 ipvsadm 、 ipset 工具 包和加载 ip_vs 内核模块,当 Kube-Proxy 以 IPVS 代理模式启动时, Kube-Proxy 将验证节点上是否安装了 IPVS 模块,如果未安装,则 Kube-Proxy 将回退到 IPtables 代理模式。
root@master1:/home/zzj# lsmod | grep vs
vmw_vsock_vmci_transport 32768 1
vsock 36864 2 vmw_vsock_vmci_transport
vmw_vmci 69632 2 vmw_balloon,vmw_vsock_vmci_transport
ip_vs_sh 16384 0
ip_vs_wrr 16384 0
ip_vs_rr 16384 0
ip_vs 151552 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_defrag_ipv6 20480 1 ip_vs
nf_conntrack 135168 9 xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4,nf_nat,ipt_MASQUERADE,nf_nat_ipv4,xt_nat,nf_conntrack_netlink,ip_vs
libcrc32c 16384 4 nf_conntrack,nf_nat,raid456,ip_vs
更多推荐
已为社区贡献3条内容
所有评论(0)