二進制部署k8s集群(3):部署kube-apiserver,簽發kube-apiserver證書|kuelete證書|kube-proxy證書


下載 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 。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM