一. 前期准備
https://jimmysong.io/kubernetes-handbook/practice/create-tls-and-secret-key.html
1. 安裝golang編譯環境, 官網(golang.org)下載安裝
2. git clone https://github.com/kubernetes/kubernetes.git
3. 直接在clone的目錄下編譯 如何編譯參考這個第一節
4. 將二進制文件上傳到服務器上
二. 生成證書
1. 使用cfssl方式生成證書,參考地址
1.1 下載安裝
curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o cfssl
chmod +x cfssl
curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o cfssljson
chmod +x cfssljson
curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o cfssl-certinfo
chmod +x cfssl-certinfo
1.2 創建 ca-config.json 文件並填寫內容
{
"signing": { "default": { "expiry": "8760h" }, "profiles": { "kubernetes": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "8760h" } } } }
備注:
過期時間配置為10年
ca-config.json:可以定義多個 profiles,分別指定不同的過期時間、使用場景等參數,后續在簽名證書時使用某個profile;
signing:表示該證書可用於簽名其它證書,生成的ca.pem證書中CA=TRUE; server auth:表示client可以用該CA對server提供的證書進行驗證; client auth:表示server可以用該CA對client提供的證書進行驗證;
1.3 創建 ca-csr.json 並填寫內容
{
"CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names":[{ "C": "<country>", "ST": "<state>", "L": "<city>", "O": "<organization>", "OU": "<organization unit>" }] }
備注:
CN : Common Name,kube-apiserver從證書中提取該字段作為請求的用戶名; O : Organization,kube-apiserver從證書中提取該字段作為請求用戶所屬的組;
1.4 生成證書秘鑰
$ cfssl gencert -initca ca-csr.json | cfssljson -bare ca
2. 生成kubernetes證書
2.1
vim kubernetes-csr.json
{
"CN": "kubernetes", "hosts": [ "127.0.0.1", "<MASTER_IP>", "<MASTER_CLUSTER_IP>", "kubernetes", "kubernetes.default", "kubernetes.default.svc", "kubernetes.default.svc.cluster", "kubernetes.default.svc.cluster.local" ], "key": { "algo": "rsa", "size": 2048 }, "names": [{ "C": "<country>", "ST": "<state>", "L": "<city>", "O": "<organization>", "OU": "<organization unit>" }] }
2.2 生成kubernetes的證書和私鑰
$ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
說明:
該證書后面可以提供給k8s集群和etcd集群使用。 hosts字段中制定授權使用該證書的IP和域名列表,因為現在要生成的證書需要被Kubernetes Master集群各個節點使用,所以這里指定了各個節點的IP和hostname。同時還要指定集群內部kube-apiserver的多個域名和IP地址10.254.0.1(后邊kube-apiserver-service-cluster-ip-range=10.254.0.0/12參數的指定網段的第一個IP)。
2.3 創建kubernetes-admin證書配置文件
$ vim admin-csr.json
{
"CN": "kubernetes-admin", "hosts": [ "172.16.110.108", "172.16.110.105", "172.16.110.107" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "HangZhou", "L": "HangZhou", "O": "system:masters", "OU": "system" } ] }
說明:
kube-apiserver將提取CN作為客戶端的用戶名,這里是kubernetes-admin,將提取O作為用戶所屬的組,這里是system:master。 kube-apiserver預定義了一些 RBAC使用的ClusterRoleBindings,例如 cluster-admin將組system:masters與 ClusterRole cluster-admin綁定,而cluster-admin擁有訪問kube-apiserver的所有權限,因此kubernetes-admin這個用戶將作為集群的超級管理員。
2.4 生成admin證書和私鑰
$ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
2.5、創建kube-proxy證書
創建配置文件
$ vim kube-proxy-csr.json
{
"CN": "system:kube-proxy", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "HangZhoue", "L": "HangZhoue", "O": "k8s", "OU": "System" } ] }
說明:
指定證書User為 system:kube-proxy kube-apiserver 預定義的RoleBinding cluster-admin將User system:kube-proxy與Role system:node-proxier綁定,將Role授予調用kube-apiserver Proxy相關API的權限;
生成證書和私鑰
$ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
最終生成的證書和秘鑰規划如下:
| 組件 | 證書 | 說明 |
|---|---|---|
| etcd | ca.pem、kubernetes-key.pem、kubernetes.pem | 和kube-apiserver通用 |
| kube-apiserver | ca.pem、kubernetes-key.pem、kubernetes.pem | kube-controller、kube-scheduler和apiserver都是部署在master可以使用非安全通行,不再單獨安裝證書。 |
| kube-proxy | ca.pem、kube-proxy-key.pem、kube-proxy.pem | |
| kubectl | ca.pem、admin-key.pem、admin.pem |
三. Etcd搭建
1. 安裝etcd
2. 編寫 etcd.service 文件並放置在service目錄下(centos7 /usr/lib/systemd/system/)
[Unit]
Description=Etcd Server
[Service]
Type=notify
WorkingDirectory=/data/etcd/
EnvironmentFile=-/etc/etcd/etcd.conf
ExecStart=/usr/bin/etcd \\
--name k8s-master \\ --cert-file=/etc/kubernetes/ssl/kubernetes.pem \\ --key-file=/etc/kubernetes/ssl/kubernetes-key.pem \\ --peer-cert-file=/etc/kubernetes/ssl/kubernetes.pem \\ --peer-key-file=/etc/kubernetes/ssl/kubernetes-key.pem \\ --trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\ --peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\ --initial-advertise-peer-urls https://172.16.110.108:2380 \\ --listen-peer-urls https://172.16.110.108:2380 \\ --listen-client-urls https://172.16.110.108:2379,https://127.0.0.1:2379 \\ --advertise-client-urls https://172.16.110.108:2379 \\ --initial-cluster-token etcd-cluster-0 \\ --initial-cluster k8s-master=https://172.16.110.108:2380,k8s-node1=https://172.16.110.15:2380,k8s-node2=https://172.16.110.107:2380 \\ --initial-cluster-state new \\ --data-dir=/data/etcd Restart=on-failure RestartSec=5 LimitNOFILE=65536 [Install] WantedBy=multi-user.target
注意:在不同的設備上要替換name、initial-advertise-peer-urls、listen-peer-urls、listen-client-urls、advertise-client-urls中的名稱和IP。
創建etcd的數據目錄
$ mkdir -p /data/etcd
3. 啟動Etcd服務
$ systemctl daemon-reload
$ systemctl start etcd
$ systemctl enable etcd //開機自動啟動
啟動的過程中,如果出現類似下面的錯誤
etcd[1109]: request cluster ID mismatch (got 67a2ce01fa646032 want f863541ccf739acf) 應該是date-dir引起的,清空該目錄,重新啟動。
4. 檢查安裝
在任意節點執行檢查命令
$ etcdctl --ca-file=/etc/kubernetes/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/kubernetes.pem \
--key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
--endpoints=https://172.16.110.108:2379,https://172.16.110.105:2379,https://172.16.110.107:2379 cluster-health
輸出
member 41793ee167c4a0b1 is healthy: got healthy result from https://172.16.110.105:2379
member d5e994c7ce1b8ced is healthy: got healthy result from https://172.16.110.107:2379
member e809b7931db45374 is healthy: got healthy result from https://172.16.110.108:2379
cluster is healthy
三. 安裝Flannel 參考文檔
四. 安裝kubectl
kubectl 默認從 ~/.kube/config 配置文件獲取訪問 kube-apiserver 地址、證書、用戶名等信息,如果沒有配置該文件,執行命令時出錯:
$ kubectl get componentstatuses
The connection to the server localhost:8080 was refused - did you specify the right host or port?
1. 安裝admin證書和私鑰
將前面創建的admin證書和私鑰拷貝到/etc/kubernetes/ssl目錄下
2. 創建kubectl kubeconfig文件
#設置集群參數 kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server="https://172.16.110.108:6443" #設置客戶端認證參數 kubectl config set-credentials admin \ --client-certificate=/etc/kubernetes/ssl/admin.pem \ --embed-certs=true \ --client-key=/etc/kubernetes/ssl/admin-key.pem #設置上下文參數 kubectl config set-context kubernetes \ --cluster=kubernetes \ --user=admin #設置默認上下文 kubectl config use-context kubernetes
五. 部署master節點
1. 部署apiserver
1.1 配置 token 文件
k8s支持通過kube-apiserver為客戶端生成TLS證書的TLS Bootstrapping功能,kubelet 首次啟動時向 kube-apiserver 發送 TLS Bootstrapping 請求,kube-apiserver 驗證 kubelet 請求中的 token 是否與它配置的 token.csv 一致,如果一致則自動為 kubelet生成證書和秘鑰。 生成方法 請閱讀RBAC文檔 生成后
ZhqAdfUAmq6tRLTD5HxIOYBQg19fYQ38,kubelet-bootstrap,10001,"system:node"
移動到
$ mv token.csv /etc/kubernetes/
1.2 創建kube-apiserver的systemd unit文件
kube-apiserver.service
[Unit]
Description=Kubernetes API Service
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
After=etcd.service
[Service]
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/apiserver
ExecStart=/root/k8s/cmd/kube-apiserver \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \ $KUBE_ETCD_SERVERS \ $KUBE_API_ADDRESS \ $KUBE_API_PORT \ $KUBELET_PORT \ $KUBE_ALLOW_PRIV \ $KUBE_SERVICE_ADDRESSES \ $KUBE_ADMISSION_CONTROL \ $KUBE_API_ARGS Restart=on-failure Type=notify LimitNOFILE=65536 [Install] WantedBy=multi-user.target
1.3 創建config在前面創建的/etc/kubernetes目錄下
KUBE_LOGTOSTDERR="--logtostderr=true" KUBE_LOG_LEVEL="--v=0" KUBE_ALLOW_PRIV="--allow-privileged=true" KUBE_MASTER="--master=http://10.100.208.177:8080"
1.4 創建apiserver配置文件同樣在/etc/kubernetes目錄下,內容如下:
KUBE_API_ADDRESS="--advertise-address=10.100.208.177 --bind-address=10.100.208.177 --insecure-bind-address=10.100.208.177" KUBE_ETCD_SERVERS="--etcd-servers=https://10.100.208.177:2379" KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" KUBE_ADMISSION_CONTROL="--admission-control=ServiceAccount,NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota" KUBE_API_ARGS="--authorization-mode=RBAC --runtime-config=rbac.authorization.k8s.io/v1beta1 --kubelet-https=true --token-auth-file=/etc/kubernetes/token.csv --service-node-port-range=30000-32767 --tls-cert-file=/etc/kubernetes/ssl/kubernetes.pem --tls-private-key-file=/etc/kubernetes/ssl/kubernetes-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/ssl/kubernetes.pem --etcd-keyfile=/etc/kubernetes/ssl/kubernetes-key.pem --enable-swagger-ui=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"
--authorization-mode=RBAC 指定在安全端口使用 RBAC 授權模式,拒絕未通過授權的請求;
kube-scheduler、kube-controller-manager 一般和 kube-apiserver 部署在同一台機器上,它們使用非安全端口和 kube-apiserver通信;
kubelet、kube-proxy、kubectl 部署在其它 Node 節點上,如果通過安全端口訪問 kube-apiserver,則必須先通過 TLS 證書認證,再通過 RBAC 授權;
kube-proxy、kubectl 通過在使用的證書里指定相關的 User、Group 來達到通過 RBAC 授權的目的;
如果使用了 kubelet TLS Boostrap 機制,則不能再指定 --kubelet-certificate-authority、--kubelet-client-certificate 和 --kubelet-client-key 選項,否則后續 kube-apiserver 校驗 kubelet 證書時出現 ”x509: certificate signed by unknown authority“ 錯誤;
--admission-control 值必須包含 ServiceAccount;
--bind-address 不能為 127.0.0.1;
runtime-config配置為rbac.authorization.k8s.io/v1beta1,表示運行時的apiVersion;
--service-cluster-ip-range 指定 Service Cluster IP 地址段,該地址段不能路由可達;
缺省情況下 kubernetes 對象保存在 etcd /registry 路徑下,可以通過 --etcd-prefix參數進行調整;
啟動服務
$ sudo systemctl daemon-reload
$ sudo systemctl enable kube-apiserver
$ sudo systemctl start kube-apiserver
$ sudo systemctl status kube-apiserver
2. 部署kube-controller-manager
2.1 創建kube-controller-manager的systemd unit文件
kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
[Service]
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/controller-manager
ExecStart=/root/k8s/cmd/kube-controller-manager \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \ $KUBE_MASTER \ $KUBE_CONTROLLER_MANAGER_ARGS Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
2.2 創建controller-manager文件同樣放在/etc/kubernetes/目錄下,內容如下:
KUBE_CONTROLLER_MANAGER_ARGS="--address=127.0.0.1 --service-cluster-ip-range=10.254.0.0/16 --cluster-name=kubernetes --cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem --cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem --service-account-private-key-file=/etc/kubernetes/ssl/ca-key.pem --root-ca-file=/etc/kubernetes/ssl/ca.pem --leader-elect=true"
--service-cluster-ip-range 參數指定 Cluster 中 Service 的CIDR范圍,該網絡在各 Node 間必須路由不可達,必須和 kube-apiserver 中的參數一致;
--cluster-signing-* 指定的證書和私鑰文件用來簽名為 TLS BootStrap 創建的證書和私鑰;
--root-ca-file 用來對 kube-apiserver 證書進行校驗,指定該參數后,才會在Pod 容器的 ServiceAccount 中放置該 CA 證書文件;
--address 值必須為 127.0.0.1,因為當前 kube-apiserver 期望 scheduler 和 controller-manager 在同一台機器
啟動服務
$ sudo systemctl daemon-reload
$ sudo systemctl enable kube-controller-manager
$ sudo systemctl start kube-controller-manager
$ sudo systemctl status kube-controller-manager
3. kube-scheduler
3.1 創建kube-scheduler的systemd unit文件 文件為/etc/systemd/system/kube-scheduler.service,內容如下:
[Unit]
Description=Kubernetes Scheduler Plugin
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
[Service]
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/scheduler
ExecStart=/root/k8s/cmd/kube-scheduler \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \ $KUBE_MASTER \ $KUBE_SCHEDULER_ARGS Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target
3.2 創建scheduler文件 文件同樣是在/etc/kubernetes目錄下,內容如下:
KUBE_SCHEDULER_ARGS="--leader-elect=true --address=127.0.0.1"
--address 值同樣必須為 127.0.0.1,因為當前 kube-apiserver 期望 scheduler 和 controller-manager 在同一台機器;
啟動服務
$ systemctl daemon-reload
$ systemctl enable kube-scheduler
$ systemctl start kube-scheduler
$ systemctl status kube-scheduler
4. 驗證安裝
$ kubectl get componentstatuses
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health": "true"} etcd-2 Healthy {"health": "true"} etcd-1 Healthy {"health": "true"}
五. node節點安裝參考
1. 安裝證書和私鑰
將之前生成admin-key.pem、admin.pem、ca-key.pem、ca.pem、kube-proxy-key.pem、kube-proxy.pem、kubernetes-key.pem、kubernetes.pem等證書拷貝到108、105、107三台設備的/etc/kubernetes/ssl目錄下,將token.csv文件拷貝到/etc/kubernetes目錄下。
2. 安裝配置kubelet
2.1 創建角色綁定
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node --user=kubelet-bootstrap
kubelet 啟動時向 kube-apiserver 發送 TLS bootstrapping 請求,需要先將 bootstrap token 文件中的 kubelet-bootstrap 用戶賦予 system:node 角色,然后 kubelet 才有權限創建認證請求(certificatesigningrequests):
--user=kubelet-bootstrap 是文件 /etc/kubernetes/token.csv 中指定的用戶名
2.2 創建bootstrapping kubeconfig文件
#設置集群參數 $ kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server="https://<MASTER_IP>:6443" \ --kubeconfig=bootstrap.kubeconfig #設置客戶端認證參數 $ kubectl config set-credentials kubelet-bootstrap \ --token=<Your token on the token.csv> \ --kubeconfig=bootstrap.kubeconfig #設置上下文參數 $ kubectl config set-context default \ --cluster=kubernetes \ --user=kubelet-bootstrap \ --kubeconfig=bootstrap.kubeconfig #設置默認上下文 $ kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
2.3 創建kubelet的systemd unit文件 文件為/etc/systemd/system/kubelet.service,內容如下:
[Unit]
Description=Kubernetes Kubelet Server
After=docker.service
Requires=docker.service
[Service]
WorkingDirectory=/var/lib/kubelet
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/kubelet
ExecStart=/root/k8s/cmd/kubelet \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \ $KUBELET_API_SERVER \ $KUBELET_ADDRESS \ $KUBELET_PORT \ $KUBELET_HOSTNAME \ $KUBE_ALLOW_PRIV \ $KUBELET_POD_INFRA_CONTAINER \ $KUBELET_ARGS Restart=on-failure [Install] WantedBy=multi-user.target
創建工作目錄
$ mkdir -p /var/lib/kubelet
2.4 創建kubelet配置文件
/etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=10.100.208.178" KUBELET_HOSTNAME="--hostname-override=10.100.208.178" KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" KUBELET_ARGS="--config=/etc/kubernetes/manifests/kubelet.yml --cluster_dns=10.254.0.2 --kubeconfig=/etc/kubernetes/bootstrap.kubeconfig --cert-dir=/etc/kubernetes/ssl --cluster_domain=cluster.local. --hairpin-mode promiscuous-bridge --serialize-image-pulls=false"
--address 不能設置為 127.0.0.1,否則后續 Pods 訪問 kubelet 的 API 接口時會失敗,因為 Pods 訪問的 127.0.0.1指向自己而不是 kubelet,然后不同的節點根據實際IP來配置;
如果設置了 --hostname-override 選項,則 kube-proxy 也需要設置該選項,否則會出現找不到 Node 的情況;
--experimental-bootstrap-kubeconfig 指向 bootstrap kubeconfig 文件,kubelet 使用該文件中的用戶名和 token 向 kube-apiserver 發送 TLS Bootstrapping 請求;
管理員通過了 CSR 請求后,kubelet 自動在 --cert-dir 目錄創建證書和私鑰文件(kubelet-client.crt 和 kubelet-client.key),然后寫入 --kubeconfig 文件(自動創建 --kubeconfig 指定的文件);
建議在 --kubeconfig 配置文件中指定 kube-apiserver 地址,如果未指定 --api-servers 選項,則必須指定 --require-kubeconfig 選項后才從配置文件中讀取 kue-apiserver 的地址,否則 kubelet 啟動后將找不到 kube-apiserver (日志中提示未找到 API Server),kubectl get nodes 不會返回對應的 Node 信息;
--cluster_dns 指定 kubedns 的 Service IP(可以先分配,后續創建 kubedns 服務時指定該 IP),--cluster_domain 指定域名后綴,這兩個參數同時指定后才會生效;
可選配置 /etc/kubernetes/manifests/kubelet.yml 相關文檔
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
failSwapOn: false
kubeletCgroups: /systemd/system.slice
evictionHard:
memory.available: "200Mi"
啟動服務
$ sudo systemctl daemon-reload
$ sudo systemctl enable kubelet
$ sudo systemctl start kubelet
$ sudo systemctl status kubelet
如果啟動出現下面錯誤:
failed to create kubelet: misconfiguration: kubelet cgroup driver: "systemd" is different from docker cgroup driver: "systemd" is different from docker cgroup driver: "cgroupfs"
要么修改kubelet的配置要么修改docker的配置,我這里修改kubelet的配置如下:
KUBELET_ARGS="--cgroup-driver=cgroupfs --cluster_dns=10.254.0.2 --experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig --kubeconfig=/etc/kubernetes/kubelet.kubeconfig --require-kubeconfig --cert-dir=/etc/kubernetes/ssl --cluster_domain=cluster.local. --hairpin-mode promiscuous-bridge --serialize-image-pulls=false"
3. 安裝配置kube-proxy
3.1 創建kube-proxy kubeconfig文件
# 設置集群參數 $ kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server="https://172.16.110.108:6443" \ --kubeconfig=kube-proxy.kubeconfig # 設置客戶端認證參數 $ kubectl config set-credentials kube-proxy \ --client-certificate=/etc/kubernetes/ssl/kube-proxy.pem \ --client-key=/etc/kubernetes/ssl/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 # 設置默認上下文 $ kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
設置集群參數和客戶端認證參數時 --embed-certs 都為 true,這會將 certificate-authority、client-certificate和 client-key 指向的證書文件內容寫入到生成的 kube-proxy.kubeconfig 文件中;
kube-proxy.pem 證書中 CN 為 system:kube-proxy,kube-apiserver 預定義的 RoleBinding cluster-admin 將User system:kube-proxy 與 Role system:node-proxier 綁定,該 Role 授予了調用 kube-apiserver Proxy 相關 API 的權限;
3.2 創建kube-proxy文件在目錄/etc/kubernetes,內容如下:
KUBE_PROXY_ARGS="--bind-address=10.100.208.178 --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig --cluster-cidr=10.254.0.0/16"
--hostname-override 參數值必須與 kubelet 的值一致,否則 kube-proxy 啟動后會找不到該 Node,從而不會創建任何 iptables 規則;
--cluster-cidr 必須與 kube-apiserver 的 --service-cluster-ip-range 選項值一致;
kube-proxy 根據 --cluster-cidr 判斷集群內部和外部流量,指定 --cluster-cidr 或 --masquerade-all 選項后 kube-proxy 才會對訪問 Service IP 的請求做 SNAT;
--kubeconfig 指定的配置文件嵌入了 kube-apiserver 的地址、用戶名、證書、秘鑰等請求和認證信息;
預定義的 RoleBinding cluster-admin 將User system:kube-proxy 與 Role system:node-proxier 綁定,該 Role 授予了調用 kube-apiserver Proxy 相關 API 的權限;
3.2 創建kube-proxy的systemd unit文件
[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
[Service]
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/kube-proxy
ExecStart=/root/k8s/cmd/kube-proxy \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \ $KUBE_MASTER \ $KUBE_PROXY_ARGS Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target
確定服務
$ sudo systemctl daemon-reload
$ sudo systemctl enable kube-proxy
$ sudo systemctl start kube-proxy
$ sudo systemctl status kube-proxy
4. 驗證安裝
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
xxx.xxx.xxx.xxx Ready <none> 2d17h xxx ............
