八.部署kube-apiserver
接下來3章節是部署Kube-Master相關的服務,包含:kube-apiserver,kube-controller-manager,kube-scheduler。
-
3個組件部署在一個節點上,為1個部署單元。
-
kube-apiserver是無狀態的,客戶端如kubelet可通過啟動參數"--api-servers"指定多個api-server,但只有第一個生效,即指定的多個api-server並沒有達到高可用的目的(可能在后續版本解決),所以可通過負載均衡做api-server的HA。
-
kube-controller-manager與kube-scheduler會修改集群的狀態信息,如果3個節點上的相關服務同時生效則會有同步與一致性問題,所以此兩種服務各自內部只能是主備的關系,kukubernetes采用租賃鎖(lease-lock)實現leader的選舉,具體到kube-controller-manager與kube-scheduler,啟動時帶上參數"--leader-elect=true"。
1. 創建kube-apiserver證書
1)創建kube-apiserver證書簽名請求
# api-server啟用雙向TLS認證 [root@kubenode1 ~]# mkdir -p /etc/kubernetes/apiserver [root@kubenode1 ~]# cd /etc/kubernetes/apiserver/ [root@kubenode1 apiserver]# touch apiserver-csr.json # hosts字段不為空時,指定授權使用該證書的ip與域名列表; # 加入集群個節點ip,1次生成證書分發即可; # 前端ha節點也需要與apiserver通信; # 同時指定集群內部多個域名與kube-apiserver注冊的名為kubernetes的服務ip(Service Cluster IP),一般是--service-cluster-ip-range 選項值指定的網段的第一個IP [root@kubenode1 apiserver]# vim apiserver-csr.json { "CN": "kubernetes", "hosts": [ "127.0.0.1", "172.30.200.10", "172.30.200.11", "172.30.200.12", "172.30.200.21", "172.30.200.22", "172.30.200.23", "169.169.0.1", "kubernetes", "kubernetes.default", "kubernetes.default.svc", "kubernetes.default.svc.cluster", "kubernetes.default.svc.cluster.local" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "ChengDu", "L": "ChengDu", "O": "k8s", "OU": "cloudteam" } ] }
2)生成kube-apiserver證書與私鑰
[root@kubenode1 apiserver]# cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \ -ca-key=/etc/kubernetes/ssl/ca-key.pem \ -config=/etc/kubernetes/ssl/ca-config.json \ -profile=kubernetes apiserver-csr.json | cfssljson -bare apiserver
# 分發apiserver.pem,apiserver-key.pem [root@kubenode1 apiserver]# scp apiserver.pem apiserver-key.pem root@172.30.200.22:/etc/kubernetes/apiserver/ [root@kubenode1 apiserver]# scp apiserver.pem apiserver-key.pem root@172.30.200.23:/etc/kubernetes/apiserver/
2. 配置kube-apiserver的systemd unit文件
相關可執行文件在部署kubectl時已部署完成。
1)創建kube-apiserver使用的客戶端token文件
kubelet 啟動時向 kube-apiserver發送注冊信息,在雙向的TLS加密通信環境中需要認證,手工為kubelet生成證書/私鑰在node節點較少且數量固定時可行,采用TLS Bootstrapping 機制,可使大量的node節點自動完成向kube-apiserver的注冊請求。
原理:kubelet 首次啟動時向 kube-apiserver 發送 TLS Bootstrapping 請求,kube-apiserver 驗證 kubelet 請求中的 token 是否與它配置的 token.csv 一致,如果一致則自動為 kubelet生成證書和秘鑰。
[root@kubenode1 ~]# mkdir -p /etc/kubernetes/bootstrap [root@kubenode1 ~]# cd /etc/kubernetes/bootstrap/ [root@kubenode1 bootstrap]# cat > token.csv << EOF ${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap" EOF # 分發 [root@kubenode1 ~]# scp /etc/kubernetes/bootstrap/token.csv root@172.30.200.22:/etc/kubernetes/bootstrap/ [root@kubenode1 ~]# scp /etc/kubernetes/bootstrap/token.csv root@172.30.200.23:/etc/kubernetes/bootstrap/
2)配置kube-apiserver的systemd unit文件
[root@kubenode1 ~]# touch /usr/lib/systemd/system/kube-apiserver.service [root@kubenode1 ~]# vim /usr/lib/systemd/system/kube-apiserver.service [Unit] Description=Kubernetes API Server Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=network.target [Service] User=root EnvironmentFile=/usr/local/kubernetes/kube-apiserver.conf ExecStart=/usr/local/kubernetes/bin/kube-apiserver $KUBE_API_ARGS Restart=on-failure RestartSec=5 Type=notify LimitNOFILE=65536 [Install] WantedBy=multi-user.target
# 啟動參數文件; # --admission-control:kuberneres集群的准入控制機制,各控制模塊以插件的形式依次生效,集群時必須包含ServiceAccount; # --bind-address:不能為 127.0.0.1;在本地址的6443端口開啟https服務,默認值0.0.0.0; # --insecure-port=0:禁用不安全的http服務,默認開啟,端口8080,設置為0禁用; --secure-port=6443:https安全端口,默認即6443,0表示禁用; # --authorization-mode:在安全端口使用 RBAC 授權模式,未通過授權的請求拒絕; # --service-cluster-ip-range:指定 Service Cluster IP 地址段,該地址段外部路由不可達; # --service-node-port-range:指定 NodePort 的端口范圍; # --storage-backend:持久化存儲類型,v1.6版本后默認即etcd3; # --enable-swagger-ui:設置為true時,啟用swagger-ui網頁,可通過apiserver的usl/swagger-ui訪問,默認為false; # --allow-privileged:設置為true時,kubernetes允許在Pod中運行擁有系統特權的容器應用; # --audit-log-*:審計日志相關; # --event-ttl:apiserver中各時間保留時間,默認即1h,通常用於審計與追蹤; # --logtostderr:默認為true,輸出到stderr,不輸出到日志; # --log-dir:日志目錄; # --v:日志級別 [root@kubenode1 ~]# touch /usr/local/kubernetes/kube-apiserver.conf [root@kubenode1 ~]# vim /usr/local/kubernetes/kube-apiserver.conf KUBE_API_ARGS="--admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota,NodeRestriction \ --advertise-address=172.30.200.21 \ --bind-address=172.30.200.21 \ --insecure-port=0 \ --authorization-mode=Node,RBAC \ --runtime-config=rbac.authorization.k8s.io/v1beta1 \ --kubelet-https=true \ --token-auth-file=/etc/kubernetes/bootstrap/token.csv \ --service-cluster-ip-range=169.169.0.0/16 \ --service-node-port-range=10000-60000 \ --tls-cert-file=/etc/kubernetes/apiserver/apiserver.pem \ --tls-private-key-file=/etc/kubernetes/apiserver/apiserver-key.pem \ --client-ca-file=/etc/kubernetes/ssl/ca.pem \ --service-account-key-file=/etc/kubernetes/ssl/ca-key.pem \ --etcd-cafile=/etc/kubernetes/ssl/ca.pem \ --etcd-certfile=/etc/kubernetes/apiserver/apiserver.pem \ --etcd-keyfile=/etc/kubernetes/apiserver/apiserver-key.pem \ --storage-backend=etcd3 \ --etcd-servers=https://172.30.200.21:2379,https://172.30.200.22:2379,https://172.30.200.23:2379 \ --enable-swagger-ui=true \ --allow-privileged=true \ --apiserver-count=3 \ --audit-log-maxage=30 \ --audit-log-maxbackup=3 \ --audit-log-maxsize=100 \ --audit-log-path=/var/lib/audit.log \ --event-ttl=1h \ --logtostderr=false \ --log-dir=/var/log/kubernetes/apiserver \ --v=2 1>>/var/log/kubernetes/apiserver/kube-apiserver.log 2>&1" # 創建日志目錄 [root@kubenode1 ~]# mkdir -p /var/log/kubernetes/apiserver
3. 啟動並驗證
[root@kubenode1 ~]# systemctl daemon-reload [root@kubenode1 ~]# systemctl enable kube-apiserver [root@kubenode1 ~]# systemctl start kube-apiserver [root@kubenode1 ~]# systemctl status kube-apiserver