下載 kubernetes 1.18.3 二進制安裝包:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md#v1183
注意:打開鏈接有很多下載包,包含kubernetes-client 、kubernetes-server 、kubernetes-node,下載第一個64位的tar.gz文件。
下載 kubernetes-client:https://dl.k8s.io/v1.18.3/kubernetes-client-darwin-amd64.tar.gz
下載 kubernetes-server:https://dl.k8s.io/v1.18.3/kubernetes-server-linux-amd64.tar.gz
下載 kubernetes-node:https://dl.k8s.io/v1.18.3/kubernetes-node-linux-amd64.tar.gz
將k8s安裝在四個節點上,四個點信息為:
節點名稱 | IP地址 | Hostname | 安裝內容 |
---|---|---|---|
harbor私有倉庫 | 192.168.0.101 | yyee-centos-1 |
harbor
|
k8s管理節點1 | 192.168.0.102 | yyee-centos-2 |
etcd,kube-apiserver,kube-controller-manager,
kube-scheduler,CNI
|
k8s管理節點2 | 192.168.0.103 | yyee-centos-3 |
etcd,kube-apiserver,kube-controller-manager,
kube-scheduler, CNI
|
k8s工作節點1 | 192.168.0.104 | yyee-centos-4 |
etcd ,kubelet,docker,kube_proxy,caliop, CNI |
k8s工作節點2 | 192.168.0.105 | yyee-centos-5 | kubelet,docker,kube_proxy,caliop, CNI |
k8s工作節點3 | 192.168.0.106 | yyee-centos-5 | kubelet,docker,kube_proxy,caliop, CNI |
下載kubernetes-server安裝包 |
分別在 192.168.0.102 與192.168.0.103兩個節點上安裝 kube-apiserver 。
首先下載kubernetes-server 1.183二進制安裝包。
下載完安裝包之后,解壓到 /opt/kubernetes 目錄。
tar xfv kubernetes-v1.18.3-server-linux-amd64.tar.gz -C /opt cd /opt/ #將kubernetes重命名為kubernetes-1.18.3 mv /opt/kubernetes /opt/kubernetes-1.18.3 #創建一個軟鏈接,方便升級 ln -s /opt/kubernetes-1.18.3/ /opt/kubernetes
/opt/kubernetes 目錄里面有個源碼包 kubernetes-src.tar.gz ,對部署沒用,把它刪掉。
/opt/kubernetes/server/bin 目錄下有很多 .tar和_tag 結尾的docker鏡像文件,把它刪掉。
cd /opt/kubernetes/server/bin
rm -f *.tar rm -f *_tag
簽發 kube-apiserver證書|client證書|kutelet證書 |
在《 二進制部署k8s集群(二): 簽發etcd證書,安裝etcd集群》 這一篇中寫了如何簽發ca根證書以及etcd證書,本篇簽發 kube-apiserver 證書需要用到上一篇簽發好的私鑰證書以及ca根證書配置文件(ca.pem, ca-csr.json, ca-config.json) 。
上一篇已經簽發的證書有:
(1) 創建證書請求文件:apiserver、client、kubelet、kube-proxy
【創建apiserver證書請求文件】
編寫證書請求文件.
vi /opt/certs/apiserver-csr.json
{ "CN": "k8s-apiserver", "hosts": [ "127.0.0.1", "192.168.0.1", "192.168.0.51", "kubernetes", "kubernetes.default", "kubernetes.default.svc", "kubernetes.default.svc.cluster", "kubernetes.default.svc.cluster.local", "192.168.0.101", "192.168.0.102", "192.168.0.103", "192.168.0.104", "192.168.0.105", "192.168.0.106", "192.168.0.161" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "Beijing", "L": "Beijing", "O": "k8s", "OU": "system" } ] }
注意hosts節點,所有需要訪問k8s的有關ip都要寫進來,包括本機ip,縮主機ip,宿主機默認網關ip。
【創建client證書請求文件】
編寫客戶端證書請求文件,為了少簽發一些證書,將 kube-proxy,kube-admin等證書合成一個客戶端證書。
vi /opt/certs/client-csr.json
{ "CN": "k8s-node", "hosts": [ ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "Beijing", "L": "Beijing", "O": "k8s", "OU": "system" } ] }
【創建 kubelete 證書請求文件】
vi /opt/certs/kubelet-csr.json
{ "CN": "k8s-kubelet", "hosts": [ "127.0.0.1", "192.168.0.51", "192.168.0.101", "192.168.0.102", "192.168.0.103", "192.168.0.104", "192.168.0.105", "192.168.0.106" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "Beijing", "L": "Beijing", "O": "k8s", "OU": "system" } ] }
hosts要把所有可能用到kebelet上的ip全都寫上, 包括windows宿主機ip,宿主機默認網關ip,vmware網關ip 。
【創建kube-proxy證書請求文件】
vi /opt/certs/kubelet-csr.json
{ "CN": "system:kube-proxy", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "Beijing", "L": "Beijing", "O": "k8s", "OU": "system" } ] }
指定該證書的 User 為 system:kube-proxy 。
注意:kube-proxy證書請求文件的CN等於system:kube-proxy,不要改,多個空格都不行。
(2) 創建kube-apiserver證書、client證書、kubelet證書、kube-proxy證書
這些證書:apiserver證書,client證書,kubelet證書,kube-proxy-client證書,包括etcd證書,都是基於同一個ca證書ca.pem、同一個ca私鑰ca-key.pem、以及同一個證書根配置文件ca-config.json創建。
#kube-apiserver證書 cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=k8s-server-client apiserver-csr.json | cfssljson -bare apiserver #client證書 cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=k8s-server-client client-csr.json | cfssljson -bare client #kubelet證書 cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=k8s-server-client kubelet-csr.json | cfssljson -bare kubelet #kube-proxy證書 cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=k8s-server-client kube-proxy-csr.json | cfssljson -bare kube-proxy-client
注意:
創建kube-apiserver證書的 -profile參數值可以配置成k8s-server ,只用於服務端通訊。
創建client證書的 -profile參數值可以配置成k8s-client ,只用於客戶端通訊。
創建kubelet證書的 -profile參數值可以配置成k8s-server ,只用於服務端通訊。
創建kube-proxy證書的 -profile參數值可以配置成k8s-client ,只用於客戶端通訊。
查看創建好的證書:
ll /opt/certs/
將apiserver-key.pem , apiserver.pem, ca-key.pem, ca.pem, client-key.pem, client.pem, kubelet-key.pem, kubelet.pem, kube-proxy-client-key.pem, kube-proxy-client.pem 十個文件拷貝到【管理節點1】與【管理節點2】的 /opt/kubernetes/server/bin/certs/ 目錄下。
mkdir /opt/kubernetes/server/bin/cert cd /opt/certs scp apiserver-key.pem apiserver.pem ca-key.pem ca.pem client-key.pem client.pem kubelet-key.pem kubelet.pem kube-proxy-client-key.pem kube-proxy-client.pem 192.168.0.102:/opt/kubernetes/server/bin/certs/ scp apiserver-key.pem apiserver.pem ca-key.pem ca.pem client-key.pem client.pem kubelet-key.pem kubelet.pem kube-proxy-client-key.pem kube-proxy-client.pem 192.168.0.103:/opt/kubernetes/server/bin/certs/
進入k8s服務器的安裝目錄查看,里面有十個證書文件。
ll /opt/kubernetes/server/bin/certs
部署kube-apiserver |
(1) 創建apiserver啟動文件
【管理節點1】的apiserver啟動文件
切換到192.168.0.102
vi /opt/kubernetes/server/bin/kube-apiserver.sh
#!/bin/bash ./kube-apiserver \ --apiserver-count 2 \ --audit-log-path /data/logs/kubernetes/kube-apiserver/audit-log \ --authorization-mode RBAC \ --client-ca-file ./certs/ca.pem \ --requestheader-client-ca-file ./certs/ca.pem \ --enable-admission-plugins NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota \ --insecure-bind-address=0.0.0.0 \ --etcd-cafile ./certs/ca.pem \ --etcd-certfile ./certs/client.pem \ --etcd-keyfile ./certs/client-key.pem \ --etcd-servers http://192.168.0.102:2379,http://192.168.0.103:2379,http://192.168.0.104:2379 \ --service-account-key-file ./certs/ca-key.pem \ --service-cluster-ip-range 10.67.0.0/16 \ --service-node-port-range 20000-60000 \ --target-ram-mb=1024 \ --kubelet-client-certificate ./certs/client.pem \ --kubelet-client-key ./certs/client-key.pem \ --log-dir /data/logs/kubernetes/kube-apiserver \ --tls-cert-file ./certs/apiserver.pem \ --tls-private-key-file ./certs/apiserver-key.pem \ --v 2
--apiserver-count 2 表示有兩個apiserver節點
--etcd-servers參數配置etcd集群地址。
--service-cluster-ip-range 10.67.0.0/16 集群內部的service虛擬ip
【管理節點1】的apiserver啟動文件
切換到192.168.0.102
vi /opt/kubernetes/server/bin/kube-apiserver.sh
#!/bin/bash ./kube-apiserver \ --apiserver-count 2 \ --audit-log-path /data/logs/kubernetes/kube-apiserver/audit-log \ --authorization-mode RBAC \ --client-ca-file ./certs/ca.pem \ --requestheader-client-ca-file ./certs/ca.pem \ --enable-admission-plugins NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota \ --insecure-bind-address=0.0.0.0 \ --etcd-cafile ./certs/ca.pem \ --etcd-certfile ./certs/client.pem \ --etcd-keyfile ./certs/client-key.pem \ --etcd-servers http://192.168.0.102:2379,http://192.168.0.103:2379,http://192.168.0.104:2379 \ --service-account-key-file ./certs/ca-key.pem \ --service-cluster-ip-range 10.67.0.0/16 \ --service-node-port-range 20000-60000 \ --target-ram-mb=1024 \ --kubelet-client-certificate ./certs/client.pem \ --kubelet-client-key ./certs/client-key.pem \ --log-dir /data/logs/kubernetes/kube-apiserver \ --tls-cert-file ./certs/apiserver.pem \ --tls-private-key-file ./certs/apiserver-key.pem \ --v 2
--apiserver-count 2 表示有兩個apiserver節點
--etcd-servers參數配置etcd集群地址。
--service-cluster-ip-range 10.67.0.0/16 集群內部的service虛擬ip
(2) 驗證apiserver是否可以啟動
創建工作目錄與數據目錄
mkdir -p /data/logs/kubernetes/kube-apiserver/audit-log
mkdir -p /data/logs/kubernetes/kube-apiserver
啟動kube-apiserver
chmod +x /opt/kubernetes/server/bin/kube-apiserver.sh
./kube-apiserver.sh
查看啟動狀態
netstat -luntp | grep kube-apiserv
用同樣的方式在 【k8s管理節點2】192.168.0.103主機上安裝kube-apiserver 。
按ctrl+c鍵退出 kube-apiserver,用其它方式開機自動啟動,我們這里用supervisor來啟動。
用supervisor啟動kube-apiserver |
supervisor是個python寫的進程管理軟件,它用子線程的方式啟動一個應用程序,當應用程序crash的時候它會重新拉起被管理的程序。
【安裝supervisor】
yum install supervisor
systemctl enable supervisord
systemctl start supervisord
【編輯kube-apiserver啟動配置文件】
將配置文件放到 /etc/supervisord 目錄下,以.ini作為擴展名,文件名可以任意,可以放置多個不同的啟動配置文件,每個配置文件以不同的服務啟動。
在【管理節點1】上編輯kube-apiserver啟動文件。
vi /etc/supervisord.d/kube-apiserver.ini
[program:kube-apiserver-01] command=/opt/kubernetes/server/bin/kube-apiserver.sh numprocs=1 directory=/opt/kubernetes/server/bin autostart=true autorestart=true startsecs=30 startretries=3 exitcodes=0,2 stopsignal=QUIT stopwaitsecs=10 user=root redirect_stderr=true stdout_logfile=/data/logs/kubernetes/kube-apiserver/apiserver.stdout.log stdout_logfile_maxbytes=64MB stdout_logfile_backups=4 stdout_capture_maxbytes=1MB stdout_events_enabled=false
在【管理節點2】上編輯kube-apiserver啟動文件。
vi /etc/supervisord.d/kube-apiserver.ini
[program:kube-apiserver-02]
command=/opt/kubernetes/server/bin/kube-apiserver.sh numprocs=1 directory=/opt/kubernetes/server/bin autostart=true autorestart=true startsecs=30 startretries=3 exitcodes=0,2 stopsignal=QUIT stopwaitsecs=10 user=root redirect_stderr=true stdout_logfile=/data/logs/kubernetes/kube-apiserver/apiserver.stdout.log stdout_logfile_maxbytes=64MB stdout_logfile_backups=4 stdout_capture_maxbytes=1MB stdout_events_enabled=false
【啟動兩個管理節點上的kube-apiserver服務】
#啟動新加入到supervisor中的服務
supervisorctl update
#查看狀態
supervisorctl status
查看kube-apiserver運行狀態
netstat -luntp | grep kube-apiserv
查看kube-apiserver啟動日志
tail -fn 200 /data/logs/kubernetes/kube-apiserver/apiserver.stdout.log
【supervisor命令說明】
supervisorctl status #查看所有進程的狀態
supervisorctl stop 服務名 #停止服務
supervisorctl start 服務名 #啟動服務
supervisorctl restart 服務名 #重啟服務
supervisorctl update #配置文件修改后使用該命令加載新的配置
supervisorctl reload #重新啟動配置中的所有程序
用nginx將兩個節點的kube-apiserver反向代理出來 |
在【管理節點1】與【管理節點2】上安裝nginx
yum install -y nginx
編輯nginx.conf配置文件,在http節點的后面添加反向代理,注意是在http節點的后面添加,跟http是平級節點。
vi /etc/nginx/nginx.conf
stream { upstream kube-apiserver { server 192.168.0.102:6443 max_fails=3 fail_timeout=30s; server 192.168.0.103:6443 max_fails=3 fail_timeout=30s; } server { listen 7443; proxy_connect_timeout 2s; proxy_timeout 900s; proxy_pass kube-apiserver; } }
反向代理到本機的7443端口。
注意,是添加到http節點的后面
檢查nginx配置語言件語法:
nginx -t
啟動nginx
systemctl start nginx
systemctl enable nginx
這樣,通過192,168.0.102:7443或者192.168.0.103:7443其中一台節點就可以訪問kube-apiserver了。
如果要對nginx做可高用,當其中一個節點上的nginx掛了之后,需要立馬把nginx拉起來,這時候用keepalived可以做到,那么就要在兩個點節上配置keepalived 。