k8s單節點部署(master ,node部分)
- 1 部署master 組件
- 2 部署worker node組件
- 2.1 將master01 上的kubelet ,kube-proxy 拷貝到node 節點
- 2.2 將node.zip包上傳到 node01的/opt目錄中
- 2.3 mater01上 生成kublet配置文件
- 2.4 在master01 上,將剛剛生成的kublet配置文件拷貝到node節點,並進行RBAC授權
- 2.5 在master01上查看角色和已授權角色
- 2.6 在node01 上使用kubelet.sh 腳本啟動kubelet
- 2.7 mater01 節點上通過kubelet的csr 請求
- 2.8 node01 節點上配置kube-proxy
- 2.9 部署node 02
- 2.9.3 在master01上通過csr請求
- 3 測試
要先安裝etcd和flannel網絡
https://www.cnblogs.com/zhijiyiyu/p/15497119.html
1 部署master 組件
1.1 master01 上創建kubernetes 工作目錄,創建ca證書,相關組件證書,私鑰目錄
1.1.1 將master.zip, k8s-cert.sh 包上傳到 /opt/k8s目錄中
#將 master.zip, k8s-cert.sh 包上傳到 /opt/k8s目錄中
[root@master01 ~]# cd /opt/k8s/
[root@master01 k8s]# ls master.zip
master.zip
[root@master01 k8s]# unzip master.zip
Archive: master.zip
inflating: apiserver.sh
inflating: controller-manager.sh
inflating: scheduler.sh
[root@master01 k8s]# chmod +x *.sh
[root@master01 k8s]# vim k8s-cert.sh
#!/bin/bash
#配置證書生成策略,讓 CA 軟件知道頒發有什么功能的證書,生成用來簽發其他組件證書的根證書
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
#生成CA證書和私鑰(根證書和私鑰)
cat > ca-csr.json <<EOF
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
#-----------------------
#生成 apiserver 的證書和私鑰(apiserver和其它k8s組件通信使用)
#hosts中將所有可能作為 apiserver 的 ip 添加進去,后面 keepalived 使用的 VIP 也要加入
cat > apiserver-csr.json <<EOF
{
"CN": "kubernetes",
"hosts": [
"10.0.0.1",
"127.0.0.1",
"192.168.23.103",
"192.168.23.10",
"192.168.23.18",
"192.168.23.11",
"192.168.23.12",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes apiserver-csr.json | cfssljson -bare apiserver
#-----------------------
#生成 kubectl 的證書和私鑰,具有admin權限
cat > admin-csr.json <<EOF
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
#-----------------------
#生成 kube-proxy 的證書和私鑰
cat > kube-proxy-csr.json <<EOF
{
"CN": "system:kube-proxy",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
1.1.2 創建kubernetes工作目錄,生成證書
#創建kubernetes工作目錄
[root@master01 k8s]# mkdir -p /opt/kubernetes/{cfg,bin,ssl}
#創建用於生成CA證書,相關組件的證書和私鑰的目錄
[root@master01 k8s]# mkdir /opt/k8s/k8s-cert
[root@master01 k8s]# mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert/
[root@master01 k8s]# cd !$
cd /opt/k8s/k8s-cert/
[root@master01 k8s-cert]# pwd
/opt/k8s/k8s-cert
#生成CA證書,相關組件的證書和私鑰
[root@master01 k8s-cert]# ./k8s-cert.sh
[root@master01 k8s-cert]# ls *pem
admin-key.pem admin.pem apiserver-key.pem apiserver.pem ca-key.pem ca.pem kube-proxy-key.pem kube-proxy.pem
#復制ca證書,apiserver相關證書和私鑰到kubernetes工作目錄的ssl子目錄中
[root@master01 k8s-cert]# cp ca*pem apiserver*pem /opt/kubernetes/ssl/
默認情況下,k8s有兩個端口 8080端口和 6443端口。master組件可以用這兩個端口通信。使用證書加密通信,就使用 6443端口。
因為master的組件(controller manage 和scheduler 和 api-server)都在一個服務器上,ontroller-manager 和kube-scheduler 設置為只調用當前機器的apiserver,使用127.0.0.1:8080通信。因此不需要簽發證書
1.2 復制master組件的關鍵命令文件到kubernetes工作目錄的bin子目錄中
#上傳kubernetes-server-linux-amd64.tar.gz到/opt/k8s/目錄中
[root@master01 k8s-cert]# cd /opt/k8s/
[root@master01 k8s]# ls kubernetes-server-linux-amd64.tar.gz
kubernetes-server-linux-amd64.tar.gz
[root@master01 k8s]# tar xf kubernetes-server-linux-amd64.tar.gz
#復制master組件的關鍵命令文件到kubernetes工作目錄的bin子目錄中
[root@master01 bin]# cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
[root@master01 bin]# ln -s /opt/kubernetes/bin/* /usr/local/bin/
1.3 創建bootstrap token 認證文件
創建bootstrap token認證文件,apiserver 啟動時會調用,然后就相當於在集群內創建了一個這個用戶,接下來可以用RBAC給他授權。
[root@master01 bin]# cd /opt/k8s/
[root@master01 k8s]# vim token.sh
#!/bin/bash
#獲取隨機數的前16個字節內容,以16進制格式輸出,並刪除其中的空格
BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
#生成token.csv文件,安裝Token序列號,用戶名,UID,用戶組 的格式生成
cat > /opt/kubernetes/cfg/token.csv << EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF
[root@master01 k8s]# chmod +x token.sh
[root@master01 k8s]# ./token.sh
1.4開啟apiserver服務
1.4.1 開啟apiserver服務
[root@master01 k8s]# cd /opt/k8s/
#$1為master的ip, https://..... 為etcd集群的位置
[root@master01 k8s]# ./apiserver.sh 192.168.23.103 \
https://192.168.23.103:2379,https://192.168.23.104:2379,http://192.168.23.105:2379
1.4.2 檢查進程是否成功開啟
[root@master01 k8s]# ps aux | grep kube-apiserver
1.4.3 查看6443和8080端口
- k8s通過kube-server這個進程提供服務,該進程運行在單個master節點上。默認有6443和8080
- 安全端口6443用於接收https請求,用於基於Token文件或客戶端證書認證
- 本地端口8080用於接收http請求,非認證或者授權的http請求通過該端口訪問API Server
[root@master01 k8s]# netstat -natp | egrep '6443|8080'
tcp 0 0 192.168.23.103:6443 0.0.0.0:* LISTEN 5055/kube-apiserver
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 5055/kube-apiserver
tcp 0 0 192.168.23.103:40466 192.168.23.103:6443 ESTABLISHED 5055/kube-apiserver
tcp 0 0 192.168.23.103:58080 192.168.23.103:2379 ESTABLISHED 5055/kube-apiserver
tcp 0 0 192.168.23.103:2379 192.168.23.103:58080 ESTABLISHED 879/etcd
tcp 0 0 192.168.23.103:6443 192.168.23.103:40466 ESTABLISHED 5055/kube-apiserver
1.4.4 查看版本信息
必須保證apiserver啟動正常,不然無法查詢到server的版本信息
[root@master01 k8s]# kubectl version
1.5 啟動scheduler 和 controller-manager 服務
#啟動scheduler 服務
[root@master01 k8s]# cd /opt/k8s/
[root@master01 k8s]#vim scheduler.sh
#!/bin/bash
#創建 kube-scheduler 啟動參數配置文件
MASTER_ADDRESS=$1
cat >/opt/kubernetes/cfg/kube-scheduler <<EOF
KUBE_SCHEDULER_OPTS="--logtostderr=true \\
--v=4 \\
--master=${MASTER_ADDRESS}:8080 \\
--leader-elect=true"
EOF
#--master:監聽 apiserver 的地址和8080端口
#--leader-elect=true:啟動 leader 選舉
#k8s中Controller-Manager和Scheduler的選主邏輯:k8s中的etcd是整個集群所有狀態信息的存儲,涉及數據的讀寫和多個etcd之間數據的同步,對數據的一致性要求嚴格,所以使用較復雜的 raft 算法來選擇用於提交數據的主節點。而 apiserver 作為集群入口,本身是無狀態的web服務器,多個 apiserver 服務之間直接負載請求並不需要做選主。Controller-Manager 和 Scheduler 作為任務類型的組件,比如 controller-manager 內置的 k8s 各種資源對象的控制器實時的 watch apiserver 獲取對象最新的變化事件做期望狀態和實際狀態調整,調度器watch未綁定節點的pod做節點選擇,顯然多個這些任務同時工作是完全沒有必要的,所以 controller-manager 和 scheduler 也是需要選主的,但是選主邏輯和 etcd 不一樣的,這里只需要保證從多個 controller-manager 和 scheduler 之間選出一個 leader 進入工作狀態即可,而無需考慮它們之間的數據一致和同步。
#創建 kube-scheduler.service 服務管理文件
cat >/usr/lib/systemd/system/kube-scheduler.service <<EOF
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-scheduler
ExecStart=/opt/kubernetes/bin/kube-scheduler \$KUBE_SCHEDULER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable kube-scheduler
systemctl restart kube-scheduler
[root@master01 k8s]# ./scheduler.sh 127.0.0.1
[root@master01 k8s]# ps aux | grep kube-scheduler
[root@master01 k8s]# vim controller-manager.sh
#!/bin/bash
#創建 kube-controller-manager 啟動參數配置文件
MASTER_ADDRESS=$1
cat >/opt/kubernetes/cfg/kube-controller-manager <<EOF
KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=true \\
--v=4 \\
--master=${MASTER_ADDRESS}:8080 \\
--leader-elect=true \\
--address=127.0.0.1 \\
--service-cluster-ip-range=10.0.0.0/24 \\
--cluster-name=kubernetes \\
--cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \\
--cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem \\
--root-ca-file=/opt/kubernetes/ssl/ca.pem \\
--service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem \\
--experimental-cluster-signing-duration=87600h0m0s"
EOF
#--cluster-name=kubernetes:集群名稱,與CA證書里的CN匹配
#--cluster-signing-cert-file:指定簽名的CA機構根證書,用來簽名為 TLS BootStrapping 創建的證書和私鑰
#--root-ca-file:指定根CA證書文件路徑,用來對 kube-apiserver 證書進行校驗,指定該參數后,才會在 Pod 容器的 ServiceAccount 中放置該 CA 證書文件
#--experimental-cluster-signing-duration:設置為 TLS BootStrapping 簽署的證書有效時間為10年,默認為1年
#創建 kube-controller-manager.service 服務管理文件
cat >/usr/lib/systemd/system/kube-controller-manager.service <<EOF
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-controller-manager
ExecStart=/opt/kubernetes/bin/kube-controller-manager \$KUBE_CONTROLLER_MANAGER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable kube-controller-manager
systemctl restart kube-controller-manager
#啟動controller-manager
[root@master01 k8s]# ./controller-manager.sh 127.0.0.1
[root@master01 k8s]# ps aux | grep controller
[root@master01 k8s]# systemctl status kube-scheduler.service
[root@master01 k8s]# systemctl status kube-controller-manager.service
1.6 將kubectl 和管理員權限綁定
[root@master01 k8s]# chmod +x admin.sh
[root@master01 k8s]# ./admin.sh
[root@master01 k8s]# vim admin.sh
#!/bin/bash
mkdir /root/.kube
KUBE_CONFIG="/root/.kube/config"
KUBE_APISERVER="https://192.168.23.103:6443"
cd /opt/k8s/k8s-cert/
kubectl config set-cluster kubernetes \
--certificate-authority=/opt/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=${KUBE_CONFIG}
kubectl config set-credentials cluster-admin \
--client-certificate=./admin.pem \
--client-key=./admin-key.pem \
--embed-certs=true \
--kubeconfig=${KUBE_CONFIG}
kubectl config set-context default \
--cluster=kubernetes \
--user=cluster-admin \
--kubeconfig=${KUBE_CONFIG}
kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
1.7 查看master節點狀態
root@master01 k8s]# kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
etcd-2 Healthy {"health":"true"}
etcd-1 Healthy {"health":"true"}
etcd-0 Healthy {"health":"true"}
controller-manager Healthy ok
2 部署worker node組件
2.1 將master01 上的kubelet ,kube-proxy 拷貝到node 節點
[root@master01 kubernetes]# cd /opt/k8s/kubernetes/server/bin/
[root@master01 bin]# scp kubelet kube-proxy 192.168.23.104:/opt/kubernetes/bin
[root@master01 bin]# scp kubelet kube-proxy 192.168.23.105:/opt/kubernetes/bin
2.2 將node.zip包上傳到 node01的/opt目錄中
[root@node01 opt]# cd /opt/
[root@node01 opt]# ls node.zip
node.zip
[root@node01 opt]# unzip node.zip
Archive: node.zip
inflating: proxy.sh
inflating: kubelet.sh
2.3 mater01上 生成kublet配置文件
#創建用於生成kubelet的配置文件目錄
[root@master01 bin]# mkdir /opt/k8s/kubeconfig
#上傳kubeconfig.sh 文件到 /opt/k8s/kubeconfig目錄
[root@master01 bin]# cd /opt/k8s/kubeconfig/
[root@master01 kubeconfig]# ls kubeconfig.sh
kubeconfig.sh
[root@master01 kubeconfig]#vim kubeconfig.sh
#!/bin/bash
#example: kubeconfig 192.168.80.10 /opt/k8s/k8s-cert/
#創建bootstrap.kubeconfig文件
#該文件中內置了 token.csv 中用戶的 Token,以及 apiserver CA 證書;kubelet 首次啟動會加載此文件,使用 apiserver CA 證書建立與 apiserver 的 TLS 通訊,使用其中的用戶 Token 作為身份標識向 apiserver 發起 CSR 請求
BOOTSTRAP_TOKEN=$(awk -F ',' '{print $1}' /opt/kubernetes/cfg/token.csv)
APISERVER=$1
SSL_DIR=$2
export KUBE_APISERVER="https://$APISERVER:6443"
# 設置集群參數
kubectl config set-cluster kubernetes \
--certificate-authority=$SSL_DIR/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=bootstrap.kubeconfig
#--embed-certs=true:表示將ca.pem證書寫入到生成的bootstrap.kubeconfig文件中
# 設置客戶端認證參數,kubelet 使用 bootstrap token 認證
kubectl config set-credentials kubelet-bootstrap \
--token=${BOOTSTRAP_TOKEN} \
--kubeconfig=bootstrap.kubeconfig
# 設置上下文參數
kubectl config set-context default \
--cluster=kubernetes \
--user=kubelet-bootstrap \
--kubeconfig=bootstrap.kubeconfig
# 使用上下文參數生成 bootstrap.kubeconfig 文件
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
#----------------------
#創建kube-proxy.kubeconfig文件
# 設置集群參數
kubectl config set-cluster kubernetes \
--certificate-authority=$SSL_DIR/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=kube-proxy.kubeconfig
# 設置客戶端認證參數,kube-proxy 使用 TLS 證書認證
kubectl config set-credentials kube-proxy \
--client-certificate=$SSL_DIR/kube-proxy.pem \
--client-key=$SSL_DIR/kube-proxy-key.pem \
--embed-certs=true \
--kubeconfig=kube-proxy.kubeconfig
# 設置上下文參數
kubectl config set-context default \
--cluster=kubernetes \
--user=kube-proxy \
--kubeconfig=kube-proxy.kubeconfig
# 使用上下文參數生成 kube-proxy.kubeconfig 文件
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
[root@master01 kubeconfig]# chmod +x kubeconfig.sh
#生成kubelet配置文件
[root@master01 kubeconfig]# ./kubeconfig.sh 192.168.23.103 /opt/k8s/k8s-cert/
[root@master01 kubeconfig]# ls
bootstrap.kubeconfig kubeconfig.sh kube-proxy.kubeconfig
kubeconfig.sh文件包含集群參數(CA證書、API Server地址) ,客戶端參數(上面生成的證書和私鑰),集群context上下文參數(集群名稱、用戶名) 。
Kubenetes組件(如kubelet, kube-proxy)通過啟動時指定不同的kubeconfig文件可以切換到不同的集群,連接到apiserver
2.4 在master01 上,將剛剛生成的kublet配置文件拷貝到node節點,並進行RBAC授權
#將bootstrap.kubeconfig kube-proxy.kubeconfig文件拷貝到node節點
[root@master01 kubeconfig]# scp bootstrap.kubeconfig kube-proxy.kubeconfig 192.168.23.104:/opt/kubernetes/cfg/
[root@master01 kubeconfig]# scp bootstrap.kubeconfig kube-proxy.kubeconfig 192.168.23.105:/opt/kubernetes/cfg/
#RBAC授權,將預設用戶kubelet-bootstrap與內置的clusterRole system:node-bootstrapper 綁定在一起,使其能夠發起CSR請求
#kublet 第一次發起csr請求,想要請求證書,首先需要獲得授權
[root@master01 kubeconfig]# kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
kubelet采用TLS Bootstrapping機制, 自動完成到kube-apiserver的注冊,在node節點量較大或者后期自動擴容時非常有用。Master apiserver啟用TLs認證后, node節點kubelet組件想要加入集群,必須使用cA簽發的有效證書才能與apiserver通信,當node節點很多時,簽署證書是一件很繁瑣的事情。因此Kubernetes引入了TLs bootstraping機制來自動頒發客戶端證書, kubelet會以一個低權限用戶自動向apiserver申請證書, kubelet的證書由apiserver動態簽署。
kubelet首次啟動通過加載bootstrap.kubeconfig中的用戶Token和apiserver CA證書發起首次CSR請求,這個Token被預先內置在apiserver節點的token.csv中,其身份為kubelet-bootstrap用戶和system: kubelet-bootstrap用戶組;想要首次CSR
請求能成功(即不會被apiserver 401拒絕) ,則需要先創建一個clusterRoleBinding,將kubelet-bootstrap用戶和
system: node-bootstrapper內置clusterRole綁定(通過kubectl get clusterroles可查詢) ,使其能夠發起CSR認證請求
TLs bootstrapping時的證書實際是由kube-controller-manager組件來簽署的,也就是說證書有效期是kube-controller-manager
組件控制的; kube-controller-manager組件提供了一個--experimental-cluster-signing-duration參數來設置簽署的證書有效時間;默認為8760h0mos,將其改為87600h0mos,即10年后再進行TLs bootstrapping簽署證書即可
也就是說kubelet首次訪問API Server時,是使用token做認證,通過后, controller Manager公為kubelet生成一個證書,以后的訪問都是用證書做認證了
2.5 在master01上查看角色和已授權角色
#查看角色
[root@master01 kubeconfig]# kubectl get clusterroles | grep system:node-bootstrapper
system:node-bootstrapper 80m
#查看已授權角色
[root@master01 kubeconfig]# kubectl get clusterrolebinding
2.6 在node01 上使用kubelet.sh 腳本啟動kubelet
[root@node01 opt]# cd /opt/
[root@node01 opt]# ls kubelet.sh
kubelet.sh
[root@node01 opt]# vim kubelet.sh
#!/bin/bash
NODE_ADDRESS=$1
DNS_SERVER_IP=${2:-"10.0.0.2"}
#創建 kubelet 啟動參數配置文件
cat >/opt/kubernetes/cfg/kubelet <<EOF
KUBELET_OPTS="--logtostderr=true \\
--v=4 \\
--hostname-override=${NODE_ADDRESS} \\
--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \\
--bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \\
--config=/opt/kubernetes/cfg/kubelet.config \\
--cert-dir=/opt/kubernetes/ssl \\
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"
EOF
#--hostname-override:指定kubelet節點在集群中顯示的主機名或IP地址,默認使用主機hostname;kube-proxy和kubelet的此項參數設置必須完全一致
#--kubeconfig:指定kubelet.kubeconfig文件位置,用於如何連接到apiserver,里面含有kubelet證書,master授權完成后會在node節點上生成 kubelet.kubeconfig 文件
#--bootstrap-kubeconfig:指定連接 apiserver 的 bootstrap.kubeconfig 文件
#--config:指定kubelet配置文件的路徑,啟動kubelet時將從此文件加載其配置
#--cert-dir:指定master頒發的客戶端證書和密鑰保存位置
#--pod-infra-container-image:指定Pod基礎容器(Pause容器)的鏡像。Pod啟動的時候都會啟動一個這樣的容器,每個pod之間相互通信需要Pause的支持,啟動Pause需要Pause基礎鏡像
#----------------------
#創建kubelet配置文件(該文件實際上就是一個yml文件,語法非常嚴格,不能出現tab鍵,冒號后面必須要有空格,每行結尾也不能有空格)
cat >/opt/kubernetes/cfg/kubelet.config <<EOF
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: ${NODE_ADDRESS}
port: 10250
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS:
- ${DNS_SERVER_IP}
clusterDomain: cluster.local.
failSwapOn: false
authentication:
anonymous:
enabled: true
EOF
#PS:當命令行參數與此配置文件(kubelet.config)有相同的值時,就會覆蓋配置文件中的該值。
#----------------------
#創建 kubelet.service 服務管理文件
cat >/usr/lib/systemd/system/kubelet.service <<EOF
[Unit]
Description=Kubernetes Kubelet
After=docker.service
Requires=docker.service
[Service]
EnvironmentFile=/opt/kubernetes/cfg/kubelet
ExecStart=/opt/kubernetes/bin/kubelet \$KUBELET_OPTS
Restart=on-failure
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable kubelet
systemctl restart kubelet
[root@node01 opt]# chmod +x kubelet.sh
#使用腳本啟動kubelet服務
oot@node01 opt]# ./kubelet.sh 192.168.23.104
[root@node01 opt]# ps aux | grep kubelet
#此時還沒有生成證書
[root@node01 opt]# ls /opt/kubernetes/ssl/
kubelet-client.key.tmp kubelet.crt kubelet.key
2.7 mater01 節點上通過kubelet的csr 請求
#檢查到node01 節點的kubelet發起的CSR請求,Pending表示等待集群給該節點簽發證書
[root@master01 opt]# kubectl get csr
NAME AGE REQUESTOR CONDITION
node-csr-0uON9h27bA3I03O59M3wUUuFMn9VyEAKxsXV93ftsoA 3m25s kubelet-bootstrap Pending
#通過csr請求狀態
[root@master01 opt]# kubectl certificate approve node-csr-0uON9h27bA3I03O59M3wUUuFMn9VyEAKxsXV93ftsoA
#再次查看csr請求狀態
[root@master01 opt]# kubectl get csr
NAME AGE REQUESTOR CONDITION
node-csr-0uON9h27bA3I03O59M3wUUuFMn9VyEAKxsXV93ftsoA 6m15s kubelet-bootstrap Approved,Issued
#查看集群節點狀態。
root@master01 opt]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.23.104 Ready <none> 14m v1.12.3
2.8 node01 節點上配置kube-proxy
[root@node01 opt]# ls /opt/kubernetes/cfg/kubelet.kubeconfig
/opt/kubernetes/cfg/kubelet.kubeconfig
[root@node01 opt]# ls /opt/kubernetes/ssl/
kubelet-client-2021-10-28-16-53-41.pem kubelet-client-current.pem kubelet.crt kubelet.key
#加載ip_vs 模塊
[root@node01 opt]# for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");\
do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
[root@node01 opt]# cd /opt/
[root@node01 opt]# ls proxy.sh
proxy.sh
[root@node01 opt]# vim proxy.sh
#!/bin/bash
NODE_ADDRESS=$1
#創建 kube-proxy 啟動參數配置文件
cat >/opt/kubernetes/cfg/kube-proxy <<EOF
KUBE_PROXY_OPTS="--logtostderr=true \\
--v=4 \\
--hostname-override=${NODE_ADDRESS} \\
--cluster-cidr=172.17.0.0/16 \\
--proxy-mode=ipvs \\
--kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig"
EOF
#--hostnameOverride: 參數值必須與 kubelet 的值一致,否則 kube-proxy 啟動后會找不到該 Node,從而不會創建任何 ipvs 規則
#--cluster-cidr:指定 Pod 網絡使用的聚合網段,Pod 使用的網段和 apiserver 中指定的 service 的 cluster ip 網段不是同一個網段。 kube-proxy 根據 --cluster-cidr 判斷集群內部和外部流量,指定 --cluster-cidr 選項后 kube-proxy 才會對訪問 Service IP 的請求做 SNAT,即來自非 Pod 網絡的流量被當成外部流量,訪問 Service 時需要做 SNAT。
#--proxy-mode:指定流量調度模式為 ipvs 模式
#--kubeconfig: 指定連接 apiserver 的 kubeconfig 文件
#----------------------
#創建 kube-proxy.service 服務管理文件
cat >/usr/lib/systemd/system/kube-proxy.service <<EOF
[Unit]
Description=Kubernetes Proxy
After=network.target
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-proxy
ExecStart=/opt/kubernetes/bin/kube-proxy \$KUBE_PROXY_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable kube-proxy
systemctl restart kube-proxy
[root@node01 opt]# chmod +x proxy.sh #使用proxy.sh 腳本啟動proxy服務[root@node01 opt]# ./proxy.sh 192.168.23.104 [root@node01 opt]# systemctl status kube-proxy.service
2.9 部署node 02
2.9.1 在node01 節點上將kubelet.sh ,proxy.sh文件拷貝到node02 節點
[root@node01 opt]# cd /opt/
[root@node01 opt]# scp kubelet.sh proxy.sh 192.168.23.105:/opt/
2.9.2 在node02 上使用kubelet.sh 啟動kubelet服務
[root@node02 opt]# cd /opt/
[root@node02 opt]# chmod +x kubelet.sh
[root@node02 opt]# ./kubelet.sh 192.168.23.105
2.9.3 在master01上通過csr請求
#查看請求
[root@master01 kubeconfig]# kubectl get csr
NAME AGE REQUESTOR CONDITION
node-csr-0uON9h27bA3I03O59M3wUUuFMn9VyEAKxsXV93ftsoA 35m kubelet-bootstrap Approved,Issued
node-csr-pN1MUK5bEta9052ytVLFHASMiLxWoQ4CPeaD3b32kS8 74s kubelet-bootstrap Pending
#通過請求
[root@master01 kubeconfig]# kubectl certificate approve node-csr-pN1MUK5bEta9052ytVLFHASMiLxWoQ4CPeaD3b32kS8
certificatesigningrequest.certificates.k8s.io/node-csr-pN1MUK5bEta9052ytVLFHASMiLxWoQ4CPeaD3b32kS8 approved
#再次查看你,狀態為已通過
[root@master01 kubeconfig]# kubectl get csr
NAME AGE REQUESTOR CONDITION
node-csr-0uON9h27bA3I03O59M3wUUuFMn9VyEAKxsXV93ftsoA 36m kubelet-bootstrap Approved,Issued
node-csr-pN1MUK5bEta9052ytVLFHASMiLxWoQ4CPeaD3b32kS8 103s kubelet-bootstrap Approved,Issued
2.9.4 查看集群中節點的狀態
[root@master01 kubeconfig]# kubectl get nodesNAME STATUS ROLES AGE VERSION192.168.23.104 Ready <none> 32m v1.12.3192.168.23.105 Ready <none> 2m28s v1.12.3
2.9.5 在node02上加載ipvs模塊
[root@node02 opt]# for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");\
do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;don
2.9.6 使用proxy.sh 啟動proxy服務
[root@node02 opt]# cd /opt/
[root@node02 opt]# chmod +x proxy.sh
[root@node02 opt]# ./proxy.sh 192.168.23.105
Created symlink from /etc/systemd/system/multi-user.target.wants/kube-proxy.service to /usr/lib/systemd/system/kube-proxy.service.
[root@node02 opt]# systemctl status kube-proxy.service
3 測試
3.1 創建資源
#創建deployment資源,名為nginx-test. 使用鏡像 nginx:1.14
[root@master01 opt]# kubectl create deployment nginx-test --image=nginx:1.14
3.2 查看pod狀態
[root@master01 opt]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-test-7dc4f9dcc9-9pxdf 1/1 Running 0 3m30s
3.3 查看pod的詳細狀態
[root@master01 opt]# kubectl describe pod nginx-test
[root@master01 opt]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
nginx-test-7dc4f9dcc9-9pxdf 1/1 Running 0 11m 172.17.4.2 192.168.23.104 <none>
ne>