7.k8s入門:kube-apiserver部署(二進位制包離線安裝)

王老桔發表於2020-10-30

一、概述

Kube-Master相關的服務:

  • kube-apiserver
  • kube-controller-manager
  • kube-scheduler。

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.1 環境準備

1.1.1 機器

主機IP角色
172.25.78.55master1
worker1
172.25.78.56master2
worker2
172.25.78.57master3
worker3
節點需要安裝的元件
masterkube-apiserver
kube-controller-manager
kube-scheduler
workerkube-proxy
kubelet

1.1.2 安裝包

  • kubernetes-server-linux-amd64.tar.gz

參考3.k8s入門:k8s部署之二進位制包離線安裝(x86伺服器)教程下載

二、安裝

2.1 使用cfssl工具集建立CA證書

如果沒有安裝cfssl,請按照3.k8s入門:cfssl部署(二進位制包離線安裝)教程安裝。

下面步驟只需要在一個節點上執行

【step.1 建立kube-apiserver證書和私鑰配置檔案】

cd /root/k8s/cert/kube-apiserver
cat > apiserver-csr.json <<EOF
{
    "CN": "kubernetes",
    "hosts": [
      "127.0.0.1",
      "172.25.78.55",
      "172.25.78.56",
      "172.25.78.57",
      "kubernetes",
      "kubernetes.default",
      "kubernetes.default.svc",
      "kubernetes.default.svc.cluster",
      "kubernetes.default.svc.cluster.local"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "BeiJing",
            "L": "BeiJing",
            "O": "k8s",
            "OU": "cloudteam"
        }
    ]
}
EOF

# hosts欄位不為空時,指定授權使用該證書的ip與域名列表;
# 在叢集中的一個節點上生成證書,然後分發給其他節點即可;
# 同時指定叢集內部多個域名與kube-apiserver註冊的名為kubernetes的服務ip(Service Cluster IP),一般是--service-cluster-ip-range 選項值指定的網段的第一個IP

【step.2 生成kube-apiserver證書和私鑰】

cfssl gencert -ca=/root/k8s/cert/ca.pem \
-ca-key=/root/k8s/cert/ca-key.pem \
-config=/root/k8s/cert/ca-config.json \
-profile=kubernetes apiserver-csr.json | cfssljson -bare apiserver

【step.3 分發證書到其它節點上】

scp apiserver*pem 172.25.78.56:/root/k8s/cert/kube-apiserver
scp apiserver*pem 172.25.78.57:/root/k8s/cert/kube-apiserver

【step.4 建立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生成證書和祕鑰。

mkdir -p /etc/kubernetes/bootstrap/ & cd /etc/kubernetes/bootstrap/
cat > token.csv << EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF

scp /etc/kubernetes/bootstrap/token.csv root@172.25.78.56:/etc/kubernetes/bootstrap/
scp /etc/kubernetes/bootstrap/token.csv root@172.25.78.57:/etc/kubernetes/bootstrap/

2.2 安裝kube-apiserver

所有節點都要執行下面的步驟

【step.1 解壓】

cd /root/k8s/package
tar -zxvf kubernetes-server-linux-amd64.tar.gz

【step.2 複製到/usr/bin】

cd kubernetes/server/bin/
cp kube-apiserver kube-controller-manager kube-scheduler kubectl /usr/bin/

【step.3 設定系統服務】

# 1.進入/usr/lib/systemd/system
cd /usr/lib/systemd/system

# 2.建立kube-apiserver的啟動檔案
vi kube-apiserver.service
# 將下面內容複製到kube-apiserver.service

[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
After=etcd.service

[Service]
EnvironmentFile=/root/k8s/conf/apiserver.conf
ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS
Restart=on-failure
Type=notify
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

【step.4 設定配置】

# 根據kube-apiserver.service中EnvironmentFile項設定的配置檔案路徑,建立kube-apiserver的配置檔案
vi /root/k8s/conf/apiserver.conf

# 將下面內容複製到apiserver.conf

KUBE_API_ARGS="--logtostderr=false \
--v=2 \
--log-dir=/var/log/kubernetes/apiserver \
--etcd-servers=https://172.25.78.55:2379,https://172.25.78.56:2379,https://172.25.78.57:2379 \
--bind-address=172.25.78.55 \
--secure-port=6443 \
--advertise-address=172.25.78.55 \
--allow-privileged=true \
--service-cluster-ip-range=10.0.0.0/24 \
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \
--authorization-mode=Node,RBAC \
--enable-bootstrap-token-auth=true \
--token-auth-file=/etc/kubernetes/bootstrap/token.csv \
--service-node-port-range=30000-32767 \
--storage-backend=etcd3 \
--kubelet-client-certificate=/root/k8s/cert/kube-apiserver/apiserver.pem \
--kubelet-client-key=/root/k8s/cert/kube-apiserver/apiserver-key.pem \
--tls-cert-file=/root/k8s/cert/kube-apiserver/apiserver.pem \
--tls-private-key-file=/root/k8s/cert/kube-apiserver/apiserver-key.pem \
--client-ca-file=/root/k8s/cert/ca.pem \
--service-account-key-file=/root/k8s/cert/ca-key.pem \
--etcd-cafile=/root/k8s/cert/ca.pem \
--etcd-certfile=/root/k8s/cert/kube-apiserver/apiserver.pem \
--etcd-keyfile=/root/k8s/cert/kube-apiserver/apiserver-key.pem \
--audit-log-maxage=30 \
--audit-log-maxbackup=3 \
--audit-log-maxsize=100 \
--audit-log-path=/var/lib/audit.log"

# --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:日誌級別

【step.5 建立日誌目錄】

mkdir -p /var/log/kubernetes/apiserver 

【step.6 啟動並設定開機自啟】

systemctl daemon-reload
systemctl enable kube-apiserver
systemctl start kube-apiserver

【step.7 驗證是否啟動成功】

# systemctl status kube-apiserver
● kube-apiserver.service - Kubernetes API Server
   Loaded: loaded (/usr/lib/systemd/system/kube-apiserver.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2020-10-29 05:06:55 EDT; 8min ago
     Docs: https://github.com/GoogleCloudPlatform/kubernetes
 Main PID: 30742 (kube-apiserver)
    Tasks: 30
   Memory: 229.8M
   CGroup: /system.slice/kube-apiserver.service
           └─30742 /usr/bin/kube-apiserver --logtostderr=false --v=2 --log-dir=/var/log/kubernetes/apiserver --etcd-servers=http://172.25.78.56:2379,http://172.25.78.58:2379 --bind-address=172.25.78.58 --secure-port=6443 --advertise-address=172.25.78.58 --allow-privile...

# 如果有問題,執行下面命令檢視報錯資訊
journalctl -xe

相關文章