下載所須要的安裝包:
#可能須要FQ,下載server就能夠了,裏邊包含了全部須要的模塊
wget https://dl.k8s.io/v1.12.7/kubernetes-server-linux-amd64.tar.gz
生成TLS證書
#使用openssl建立CA證書,部署kubernetes服務使用的所需證書以下
#根證書公鑰與私鑰
ca.pem與ca.key
#API Server公鑰與私鑰
apiserver.pem與apiserver.key
#集羣管理員公鑰與私鑰
admin.pem與admin.key
#節點proxy公鑰與私鑰
proxy.pem與proxy.key
#節點kubelet的公鑰與私鑰:是經過boostrap響應的方式,在啓動kubelet自動會產生, 而後在master經過csr請求,就會產生。
建立根證書
cd /usr/local/src/tls
#生成RSA私鑰(無加密)
openssl genrsa -out ca.key 2048
#生成 RSA 私鑰和自簽名證書
openssl req -x509 -new -nodes -key ca.key -days 10000 -out ca.pem -subj "/CN=kubernetes/O=k8s"
# 參數說明:
-new 指生成證書請求
-x509 表示直接輸出證書
-key 指定私鑰文件
-days 指定證書過時時間爲10000天
-out 導出結束後證書文件
-subj 輸入證書擁有者信息,這裏指定 CN 以及 O 的值
# 重要的CN以及0關鍵參數:
-subj 設置CN以及0的值很重要,kubernetes會從證書這兩個值對應獲取相關的用戶名以及用戶租的值,以下:
"CN":Common Name,kube-apiserver 從證書中提取該字段做爲請求的用戶名 (User Name);瀏覽器使用該字段驗證網站是否合法;
"O":Organization,kube-apiserver 從證書中提取該字段做爲請求用戶所屬的組 (Group);
apiserver證書生成
master中須要證書以下:
根證書公鑰(root CA public key, ca.key)、根證書(ca.pem);
apiserver證書:apiserver.pem與其私鑰apiserver-key.pem
1.建立openssl.cnf
openssl示例:
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster.local
IP.1 = ${K8S_SERVICE_IP}
IP.2 = ${MASTER_IPV4}
[^_^]:
使用有API被訪問的Master的IP地址替換${MASTER_IPV4},說白了就是apiserver所在的地址,使用本身規劃做爲kubernetes service IP端的首IP替換${K8S_SERVICE_IP}如:通常以10.100.0.0/16做爲service的服務IP端,則此處以10.100.0.1替換${K8S_SERVICE_IP}
若是在高可用配置中部署多個Master節點,須要添加更多的TLS subjectAltNames (SANs)。每一個證書合適的SANs配置依賴於從節點與kubectl用戶是怎樣與Master節點通信的:直接經過IP地址、經過負載均衡、或者經過解析DNS名稱。
DNS.5 = ${MASTER_DNS_NAME}
IP.3 = ${MASTER_IP}
IP.4 = ${MASTER_LOADBALANCER_IP}
從節點將經過${MASTER_DNS_NAME}訪問到Loadbalancer。
根據上面的示例建立openssl的cnf文件
vim openssl.cnf
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster
DNS.5 = kubernetes.default.svc.cluster.local
DNS.6 = k8s_master
IP.1 = 10.10.10.1 # ClusterServiceIP 地址
IP.2 = 172.16.1.168 # master IP地址
IP.3 = 10.10.11.1 # docker IP地址
IP.4 = 10.10.10.1 # kubernetes DNS IP地址
說明:ClusterServiceIP和kubernetes DNS IP地址 須要在同一個網段,除了masterIP是你查看的,其餘IP是須要提早規劃的
#生成apiserver 證書對
openssl genrsa -out apiserver.key 2048
openssl req -new -key apiserver.key -out apiserver.csr -subj "/CN=kubernetes/O=k8s" -config openssl.cnf
openssl x509 -req -in apiserver.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out apiserver.pem -days 3650 -extensions v3_req -extfile openssl.cnf
通常生成的根證書(ca.key, ca.pem)與apiserver證書(apiserver.key,apiserver.pem)放置在Master節點的/etc/kubernetes/kubernetesTLS/路徑下(這個路徑是能夠自定義修改的,不必定要用我這個)
證書配置相關說明
apiserver的配置中須要指定以下參數
## Kubernetes的訪問證書配置:
--token-auth-file=/etc/kubernetes/token.csv
--tls-cert-file=/etc/kubernetes/kubernetesTLS/apiserver.pem
--tls-private-key-file=/etc/kubernetes/kubernetesTLS/apiserver.key
--client-ca-file=/etc/kubernetes/kubernetesTLS/ca.pem
--service-account-key-file=/etc/kubernetes/kubernetesTLS/ca.key
## Etcd的訪問證書配置:
--storage-backend=etcd3
--etcd-cafile=/etc/etcd/etcdSSL/ca.pem
--etcd-certfile=/etc/etcd/etcdSSL/etcd.pem
--etcd-keyfile=/etc/etcd/etcdSSL/etcd-key.pem
controller-manager的配置中須要指定以下參數:
## Kubernetes的訪問證書配置:
--cluster-name=kubernetes
--cluster-signing-cert-file=/etc/kubernetes/kubernetesTLS/ca.pem
--cluster-signing-key-file=/etc/kubernetes/kubernetesTLS/ca.key
--service-account-private-key-file=/etc/kubernetes/kubernetesTLS/ca.key
--root-ca-file=/etc/kubernetes/kubernetesTLS/ca.pem
admin集羣管理員證書生成
## 此證書用於kubectl,設置方式以下:
openssl genrsa -out admin.key 2048
openssl req -new -key admin.key -out admin.csr -subj "/CN=admin/O=system:masters/OU=System"
openssl x509 -req -in admin.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out admin.pem -days 3650
說明:
因爲後續 kube-apiserver 在啓用RBAC模式以後, 客戶端(如 kubelet、kube-proxy、Pod)請求進行受權的時候會須要認證用戶名、以及用戶組;
那麼所謂的用戶名和用戶組從哪裏來定義呢?
咱們來看看上面openssl建立證書的語句:
openssl req -new -key admin.key -out admin.csr -subj "/CN=admin/O=system:masters/OU=System"
其中這裏的/CN=admin/O=system:masters/OU=System就是在CN定義用戶爲admin,O定義用戶組爲system:masters,OU 指定該證書的 Group 爲 system:masters。
那麼定義好以後,在kubernetes中是怎麼使用的呢?
kube-apiserver 預約義了一些 RBAC 使用的 RoleBindings(角色),如 cluster-admin (角色)將 Group(組) system:masters與 Role(角色) cluster-admin 綁定,該 Role 授予了調用kube-apiserver 的全部 API的權限;
那麼固然的,咱們建立admin的證書的時候,就要按照該上面的說明定義好證書的組、用戶。
另外當kubelet使用該證書訪問kube-apiserver是什麼樣的過程呢?
在證書的簽名中,OU 指定該證書的 Group 爲 system:masters,kubelet 使用該證書訪問 kube-apiserver 時 ,因爲證書被 CA 簽名,因此認證經過,同時因爲證書用戶組爲通過預受權的 system:masters,因此被授予訪問全部 API 的權限;
同理,若是你是使用CFSSL來簽名證書也須要這樣去配置好用戶和用戶組。在這裏就不單獨寫CFSSL籤kubernetes的相關證書了。
重要的是要好好理解證書籤名與kubernetes的RBAC角色綁定的關係。
節點proxy證書生成
openssl genrsa -out proxy.key 2048
openssl req -new -key proxy.key -out proxy.csr -subj "/CN=system:kube-proxy"
openssl x509 -req -in proxy.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out proxy.pem -days 3650
說明:
從上面解析說明admin的CN簽名與kubernetes角色綁定的關係中,這裏簡單一眼就看出CN是拿來定義proxy的用戶的。
CN 指定該證書的請求 User(用戶) 爲 system:kube-proxy;
在kubernetes的RABC默認角色綁定中,kube-apiserver 預約義的 RoleBinding cluster-admin將User system:kube-proxy 與 Role system:node-proxier 綁定,該 Role 授予了調用 kube-apiserver Proxy 相關 API 的權限;
將生成的ca證書拷貝至準備部署的指定目錄
mkdir /etc/kubernetes/kubernetesTLS
cp admin.key admin.pem apiserver.key apiserver.pem ca.key ca.pem proxy.key proxy.pem /etc/kubernetes/kubernetesTLS/
ll /etc/kubernetes/kubernetesTLS/
-rw-r--r--. 1 root root 1675 6月 20 14:55 admin.key
-rw-r--r--. 1 root root 1050 6月 20 14:55 admin.pem
-rw-r--r--. 1 root root 1675 6月 20 14:55 apiserver.key
-rw-r--r--. 1 root root 1302 6月 20 14:55 apiserver.pem
-rw-r--r--. 1 root root 1679 6月 20 14:55 ca.key
-rw-r--r--. 1 root root 1135 6月 20 14:55 ca.pem
-rw-r--r--. 1 root root 1675 6月 20 14:56 proxy.key
-rw-r--r--. 1 root root 1009 6月 20 14:56 proxy.pem
以上就是部署master節點所須要的證書文件了
部署master
將master所需的二進制執行文件拷貝至/user/bin目錄下
解壓剛開始下載的server那個tar包
cp kube-apiserver kube-scheduler kube-controller-manager kubectl /usr/bin/
#API Server權限控制方式介紹
API Server權限控制分爲三種:
Authentication(身份認證)、Authorization(受權)、AdmissionControl(准入控制)。
身份認證:
當客戶端向Kubernetes非只讀端口發起API請求時,Kubernetes經過三種方式來認證用戶的合法性。kubernetes中,驗證用戶是否有權限操做api的方式有三種:證書認證,token認證,基本信息認證。
① 證書認證
設置apiserver的啓動參數:--client_ca_file=SOMEFILE ,這個被引用的文件中包含的驗證client的證書,若是被驗證經過,那麼這個驗證記錄中的主體對象將會做爲請求的username。
② Token認證(本次使用token認證的方式)
設置apiserver的啓動參數:--token_auth_file=SOMEFILE。 token file的格式包含三列:token,username,userid。當使用token做爲驗證方式時,在對apiserver的http請求中,增長 一個Header字段:Authorization ,將它的值設置爲:Bearer SOMETOKEN。
③ 基本信息認證
設置apiserver的啓動參數:--basic_auth_file=SOMEFILE,若是更改了文件中的密碼,只有從新啓動apiserver使 其從新生效。其文件的基本格式包含三列:password,username,userid。當使用此做爲認證方式時,在對apiserver的http 請求中,增長一個Header字段:Authorization,將它的值設置爲: Basic BASE64ENCODEDUSER:PASSWORD。
#建立 TLS Bootstrapping Token
Token auth file
Token能夠是任意的包涵128 bit的字符串,可使用安全的隨機數發生器生成。
vim create_token.sh
#!/bin/bash
basedir=$(cd `dirname $0`;pwd)
## set param
BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
## function and implments
function save_BOOTSTRAP_TOKEN(){
cat > $configConfDir/BOOTSTRAP_TOKEN <<EOF
$BOOTSTRAP_TOKEN
EOF
}
save_BOOTSTRAP_TOKEN
function create_token(){
cat > $kubernetesDir/token.csv <<EOF
$BOOTSTRAP_TOKEN,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF
}
create_token
cat /etc/kubernetes/token.csv
0b454f858c29982f217ebec71779da7c,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
說明:
第一列:隨機字符串,本身可生成
第二列:用戶名
第三列:UID
第四列:用戶組
後續將token.csv發到全部機器(Master 和 Node)的 /etc/kubernetes/ 目錄
建立admin用戶的集羣參數
在前面使用openssl建立TLS證書的時候已經對證書的用戶以及組簽名至證書之中,那麼下一步就是定義admin用戶在集羣中的參數了。
vim create_admin.sh
#!/bin/bash
kubernetesTLSDir=/etc/kubernetes/kubernetesTLS
## set param
MASTER_IP='172.16.1.168'
KUBE_APISERVER="https://$MASTER_IP:6443"
# 設置集羣參數
function config_cluster_param(){
kubectl config set-cluster kubernetes \
--certificate-authority=$kubernetesTLSDir/ca.pem \
--embed-certs=true \
--server=$KUBE_APISERVER
}
config_cluster_param
# 設置管理員認證參數
function config_admin_credentials(){
kubectl config set-credentials admin \
--client-certificate=$kubernetesTLSDir/admin.pem \
--client-key=$kubernetesTLSDir/admin.key \
--embed-certs=true
}
config_admin_credentials
# 設置管理員上下文參數
function config_admin_context(){
kubectl config set-context kubernetes --cluster=kubernetes --user=admin
}
config_admin_context
# 設置集羣默認上下文參數
function config_default_context(){
kubectl config use-context kubernetes
}
config_default_context
值得注意的採用token認證的方式,kubernetes在後續是須要建立bootstrap.kubeconfig的文件的,那麼咱們須要將admin相關的TLS證書文件寫入這個bootstrap.kubeconfig文件。
該如何將admin的TLS文件參數寫入bootstrap.kubeconfig呢?
這時候就要藉助這個--embed-certs 的參數了,當該參數爲 true 時表示將 certificate-authority 證書寫入到生成的 bootstrap.kubeconfig文件中。
在指定了參數以後,後續由 kube-apiserver 自動生成;
安裝kube-apiserver
編寫kube-apiserver.service(/usr/lib/systemd/system)
vim /usr/lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kube-apiserver Service
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
[Service]
Type=notify
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/apiserver
ExecStart=/usr/bin/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=always
LimitNOFILE=65536
[Install]
WantedBy=default.target
#設置config
vim /etc/kubernetes/config
###
# kubernetes system config
#
# The following values are used to configure various aspects of all
# kubernetes services, including
#
# kube-apiserver.service
# kube-controller-manager.service
# kube-scheduler.service
# kubelet.service
# kube-proxy.service
# logging to stderr means we get it in the systemd journal
# 表示錯誤日誌記錄到文件仍是輸出到stderr。
KUBE_LOGTOSTDERR="--logtostderr=true"
# journal message level, 0 is debug
# 日誌等級。設置0則是debug等級
KUBE_LOG_LEVEL="--v=0"
# Should this cluster be allowed to run privileged docker containers
# 容許運行特權容器。
KUBE_ALLOW_PRIV="--allow-privileged=true"
# How the controller-manager, scheduler, and proxy find the apiserver
# 設置master服務器的訪問
KUBE_MASTER="--master=http://172.16.1.168:8080"
#設置apiserver
vim /etc/kubernetes/apiserver
###
## kubernetes system config
##
## The following values are used to configure the kube-apiserver
##
#
## The address on the local server to listen to.
KUBE_API_ADDRESS="--advertise-address=172.16.1.168 --bind-address=172.16.1.168 --insecure-bind-address=172.16.1.168"
#
## The port on the local server to listen on.
#KUBE_API_PORT="--port=8080"
#
## Port minions listen on
#KUBELET_PORT="--kubelet-port=10250"
#
## Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd-servers=https://172.16.1.168:2379"
#
## Address range to use for services
#services負載均衡的ip分配
#cat /root/openssl/openssl.cnf中第一個ip 就是該網段內
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.10.10.0/24"
#
## default admission control policies
KUBE_ADMISSION_CONTROL="--admission-control=ServiceAccount,NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota,NodeRestriction"
## Add your own!
KUBE_API_ARGS="--authorization-mode=Node,RBAC \
--kubelet-https=true \
--token-auth-file=/etc/kubernetes/token.csv \
--service-node-port-range=30000-52767 \
--tls-cert-file=/etc/kubernetes/kubernetesTLS/apiserver.pem \
--tls-private-key-file=/etc/kubernetes/kubernetesTLS/apiserver.key \
--client-ca-file=/etc/kubernetes/kubernetesTLS/ca.pem \
--service-account-key-file=/etc/kubernetes/kubernetesTLS/ca.key \
--etcd-cafile=/etc/etcd/etcdSSL/ca.pem \
--etcd-certfile=/etc/etcd/etcdSSL/etcd.pem \
--etcd-keyfile=/etc/etcd/etcdSSL/etcd-key.pem"
參數說明
--authorization-mode=Node,RBAC
啓用Node RBAC插件
--runtime-config=rbac.authorization.k8s.io/v1beta1
運行的rabc配置文件
--kubelet-https=true
啓用https
--token-auth-file=$kubernetesDir/token.csv
指定生成token文件
--service-node-port-range=30000-32767
設置node port端口號範圍30000~32767
--tls-cert-file=$kubernetesTLSDir/apiserver.pem
指定apiserver的tls公鑰證書
--tls-private-key-file=$kubernetesTLSDir/apiserver.key
指定apiserver的tls私鑰證書
--client-ca-file=$kubernetesTLSDir/ca.pem
指定TLS證書的ca根證書公鑰
--service-account-key-file=$kubernetesTLSDir/ca.key
指定apiserver的tls證書
--storage-backend=etcd3
指定etcd存儲爲version 3系列
--etcd-cafile=$etcdCaPem
指定etcd訪問的ca根證書公鑰
--etcd-certfile=$etcdPem
指定etcd訪問的TLS證書公鑰
--etcd-keyfile=$etcdKeyPem
指定etcd訪問的TLS證書私鑰
--enable-swagger-ui=true
啓用 swagger-ui 功能,Kubernetes使用了swagger-ui提供API在線查詢功能
--apiserver-count=3
設置集羣中運行的API Sever數量,這種使用單個也不要緊
--event-ttl=1h
API Server 對於各類審計時間保存1小時
#啓動api
systemctl daemon-reload
systemctl enable kube-apiserver
systemctl start kube-apiserver
systemctl status kube-apiserver
#發現有報錯Apr 27 02:07:34 k8s-master kube-apiserver[13217]: E0427 02:07:34.984980 13217 repair.go:171] the cluster IP 10.0.6.1 for service kubernetes/default is not within the service CIDR 10.244.6.0/24; please recreate
#解決方案
若是中途修改過--service-cluster-ip-range地址,則必須將default命名空間的kubernetes的service給刪除,使用命令:kubectl delete service kubernetes,而後系統會自動用新的ip重建這個service,否則apiserver的log有報錯the cluster IP x.x.x.x for service kubernetes/default is not within the service CIDR x.x.x.x/16; please recreate
kubectl delete service
systemctl restart kube-apiserver
systemctl status kube-apiserver
#查看沒有報錯了
安裝kube-controller-manager
vim /usr/lib/systemd/system/kube-controller-manager.service
[Unit]
Description=Kube-controller-manager Service
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
After=kube-apiserver.service
Requires=kube-apiserver.service
[Service]
Type=simple
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/controller-manager
ExecStart=/usr/bin/kube-controller-manager \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \
$KUBE_MASTER \
$KUBE_CONTROLLER_MANAGER_ARGS
Restart=always
LimitNOFILE=65536
[Install]
WantedBy=default.target
vim /etc/kubernetes/controller-manager
###
# The following values are used to configure the kubernetes controller-manager
# defaults from config and apiserver should be adequate
# Add your own!
KUBE_CONTROLLER_MANAGER_ARGS="--master=http://172.16.1.168:8080 \
--address=127.0.0.1 \
--service-cluster-ip-range=10.10.10.0/24 \
--cluster-name=kubernetes \
--cluster-signing-cert-file=/etc/kubernetes/kubernetesTLS/ca.pem \
--cluster-signing-key-file=/etc/kubernetes/kubernetesTLS/ca.key \
--service-account-private-key-file=/etc/kubernetes/kubernetesTLS/ca.key \
--root-ca-file=/etc/kubernetes/kubernetesTLS/ca.pem \
--leader-elect=true \
--experimental-cluster-signing-duration=87600h0m0s"
#證書有效期10年
#參數說明
master=http://172.16.5.81:8080
配置master訪問地址
--address=127.0.0.1
配置監聽本地IP地址,address 值必須爲 127.0.0.1,由於當前 kube-apiserver 指望 scheduler 和 controller-manager 在同一臺機器
--service-cluster-ip-range=10.0.6.0/24
設置kubernetes的service的網段
--cluster-name=kubernetes
設置集羣的域名爲kubernetes
--cluster-signing-cert-file=$kubernetesTLSDir/ca.pem
設置集羣簽署TLS的ca根證書公鑰 。指定的證書和私鑰文件用來簽名爲 TLS BootStrap 建立的證書和私鑰;
--cluster-signing-key-file=$kubernetesTLSDir/ca.key
設置集羣簽署TLS的ca根證書私鑰 ;指定的證書和私鑰文件用來簽名爲 TLS BootStrap 建立的證書和私鑰;
--service-account-private-key-file=$kubernetesTLSDir/ca.key
設置集羣安全帳號簽署TLS的ca根證書私鑰
--root-ca-file=$kubernetesTLSDir/ca.pem
設置集羣root用戶簽署TLS的ca根證書公鑰;用來對 kube-apiserver 證書進行校驗,指定該參數後,纔會在Pod 容器的 ServiceAccount 中放置該 CA 證書文件;
--leader-elect=true
設置啓動選舉,可是目前只啓動一個,也沒地方要選擇,主要在於API Sever有多個的時候
--cluster-cidr=$podClusterIP
設置集羣pod的IP網段
#啓動controller-manager
systemctl daemon-reload
systemctl enable kube-controller-manager
systemctl start kube-controller-manager
systemctl status kube-controller-manager
安裝kube-scheduler
vim /usr/lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kube-scheduler Service
After=network.target
[Service]
Type=simple
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/scheduler
ExecStart=/usr/bin/kube-scheduler \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \
$KUBE_MASTER \
$KUBE_SCHEDULER_ARGS
Restart=always
LimitNOFILE=65536
[Install]
WantedBy=default.target
vim /etc/kubernetes/scheduler
###
# The following values are used to configure the kubernetes scheduler
# defaults from config and scheduler should be adequate
# Add your own!
KUBE_SCHEDULER_ARGS="--master=http://172.16.1.168:8080 --leader-elect=true --address=127.0.0.1"
#參數說明
--master=http://172.16.5.81:8080
定義配置master的apiserver訪問地址
--leader-elect=true
設置啓動選舉,可是目前只啓動一個,也沒地方要選擇,主要在於API Sever有多個的時候
--address=127.0.0.1
配置監聽本地IP地址,address 值必須爲 127.0.0.1,由於當前 kube-apiserver 指望 scheduler 和 controller-manager 在同一臺機器
#啓動scheduler
systemctl daemon-reload
systemctl enable kube-scheduler
systemctl restart kube-scheduler
systemctl status kube-scheduler
查看集羣健康
kubectl get cs
建立 kube-proxy kubeconfig 文件以及相關集羣參數
cat create_kubeconfig_file.sh
#!/bin/bash
basedir=$(cd `dirname $0`;pwd)
serviceDir=/usr/lib/systemd/system
binDir=/usr/bin
kubernetesDir=/etc/kubernetes
kubernetesTLSDir=/etc/kubernetes/kubernetesTLS
configdir=$basedir/configDir
configServiceDir=$configdir/service
configConfDir=$configdir/conf
## set param
MASTER_IP='172.16.1.168'
BOOTSTRAP_TOKEN=7d4b6fad6efc458d77a11113fa625c88
#echo $BOOTSTRAP_TOKEN
## function and implments
# set proxy
function create_proxy_kubeconfig(){
kubectl config set-cluster kubernetes \
--certificate-authority=$kubernetesTLSDir/ca.pem \
--embed-certs=true \
--server=https://$MASTER_IP:6443 \
--kubeconfig=$kubernetesDir/kube-proxy.kubeconfig
}
create_proxy_kubeconfig
function config_proxy_credentials(){
kubectl config set-credentials kube-proxy \
--client-certificate=$kubernetesTLSDir/proxy.pem \
--client-key=$kubernetesTLSDir/proxy.key \
--embed-certs=true \
--kubeconfig=$kubernetesDir/kube-proxy.kubeconfig
}
config_proxy_credentials
function config_proxy_context(){
kubectl config set-context default \
--cluster=kubernetes \
--user=kube-proxy \
--kubeconfig=$kubernetesDir/kube-proxy.kubeconfig
}
config_proxy_context
function set_proxy_context(){
kubectl config use-context default --kubeconfig=$kubernetesDir/kube-proxy.kubeconfig
}
set_proxy_context
## set bootstrapping
function create_kubelet_bootstrapping_kubeconfig(){
kubectl config set-cluster kubernetes \
--certificate-authority=$kubernetesTLSDir/ca.pem \
--embed-certs=true \
--server=https://$MASTER_IP:6443 \
--kubeconfig=$kubernetesDir/bootstrap.kubeconfig
}
create_kubelet_bootstrapping_kubeconfig
function config_kubelet_bootstrapping_credentials(){
kubectl config set-credentials kubelet-bootstrap \
--token=$BOOTSTRAP_TOKEN \
--kubeconfig=$kubernetesDir/bootstrap.kubeconfig
}
config_kubelet_bootstrapping_credentials
function config_kubernetes_bootstrap_kubeconfig(){
kubectl config set-context default \
--cluster=kubernetes \
--user=kubelet-bootstrap \
--kubeconfig=$kubernetesDir/bootstrap.kubeconfig
}
config_kubernetes_bootstrap_kubeconfig
function set_bootstrap_context(){
kubectl config use-context default \
--kubeconfig=$kubernetesDir/bootstrap.kubeconfig
}
set_bootstrap_context
## create rolebinding
function create_cluster_rolebinding(){
kubectl create --insecure-skip-tls-verify clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap
}
create_cluster_rolebinding
#查看生成的內容
cat /etc/kubernetes/kube-proxy.kubeconfig
cat /etc/kubernetes/bootstrap.kubeconfig
將所需文件拷貝到node節點上面
確認後續master須要拷貝到node的相關證書文件
由於node部署的時候,proxy和kubelet是須要拷貝上面生成的證書以及kubeconfig文件的,這裏羅列以下:
[root@k8s-master ~]# tree /etc/kubernetes/
/etc/kubernetes/
├── apiserver
├── bootstrap.kubeconfig
├── config
├── controller-manager
├── kube-proxy.kubeconfig
├── kubernetesTLS
│ ├── admin.key
│ ├── admin.pem
│ ├── apiserver.key
│ ├── apiserver.pem
│ ├── ca.key
│ ├── ca.pem
│ ├── proxy.key
│ └── proxy.pem
├── scheduler
└── token.csv
部署Node節點服務(記得關閉防火牆、swap、selinux)
#拷貝Master節點建立的TLS以及kubeconfig文件至Node節點服務
scp -r -i /root/.ssh/all_Server_key /etc/kubernetes/ root@172.16.1.167:/etc/
scp -r -i /root/.ssh/all_Server_key /etc/kubernetes/ root@172.16.1.166:/etc/
#拷貝訪問etcd集羣的TLS證書文件至Node節點服務
scp -r -i /root/.ssh/all_Server_key /etc/etcd/ root@172.16.1.167:/etc/
scp -r -i /root/.ssh/all_Server_key /etc/etcd/ root@172.16.1.166:/etc/
由於每臺Node都須要訪問Etcd集羣服務,在後面部署Calico或者flanneld網絡的時候都是須要證書訪問etcd集羣的,該部分就會在後面的部署中說明了。
但是,若是新增一臺服務器想要加入Node的話,這時候該臺服務器就須要單獨將證書拷貝至相應的文件目錄了。
#拷貝二進制可執行文件至Node服務器(/usr/bin)
scp -i /root/.ssh/all_Server_key kubelet kubectl kube-proxy 172.16.1.166:/usr/bin/
scp -i /root/.ssh/all_Server_key kubelet kubectl kube-proxy 172.16.1.167:/usr/bin/
部署kubelet服務
vim /usr/lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service
[Service]
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/kubelet
ExecStart=/usr/bin/kubelet \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \
$KUBELET_CONFIG\
$KUBELET_ADDRESS \
$KUBELET_PORT \
$KUBELET_HOSTNAME \
$KUBELET_POD_INFRA_CONTAINER \
$KUBELET_ARGS
Restart=on-failure
[Install]
WantedBy=multi-user.target
vim /etc/kubernetes/kubelet
###
## kubernetes kubelet (minion) config
#
## The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
#KUBELET_ADDRESS="--address=0.0.0.0"
#
## The port for the info server to serve on
#KUBELET_PORT="--port=10250"
#
## You may leave this blank to use the actual hostname
#這個ip改爲node本機ip
KUBELET_HOSTNAME="--hostname-override=172.16.1.167"
#
## location of the api-server
KUBELET_CONFIG="--kubeconfig=/etc/kubernetes/kubelet.kubeconfig"
#
## pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=reg.kt007.com/library/pause-amd64:3.1"
#
## Add your own!
KUBELET_ARGS="--cluster-dns=10.10.10.2 \
--serialize-image-pulls=false \
--bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig \
--kubeconfig=/etc/kubernetes/kubelet.kubeconfig \
--cert-dir=/etc/kubernetes/kubernetesTLS \
--cluster-domain=cluster.local."
#參數說明
--cluster-dns=10.0.6.200
設置kubernetes集羣網絡中內部DNS的IP地址,後續用於CoreDNS
--serialize-image-pulls=false
設置kubernetes集羣容許使用http非安全鏡像拉取
--bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig
設置bootstrap.kubeconfig的文件路徑
--cert-dir=/etc/kubernetes/kubernetesTLS
設置kubernetes的TLS文件路徑,後續kubelet服務啓動以後,會在該文件夾自動建立kubelet相關公鑰和私鑰文件
--cluster-domain=cluster.local.
設置kubernetes集羣的DNS域名
--hairpin-mode promiscuous-bridge
設置pod橋接網絡模式
--network-plugin=cni
設置啓用CNI網絡插件,由於後續是使用Calico網絡,因此須要配置
#啓動kubelet服務
systemctl daemon-reload
systemctl enable kubelet
systemctl start kubelet
systemctl status kubelet
部署kube-proxy服務
vim /usr/lib/systemd/system/kube-proxy.service
[Unit]
Description=Kube Proxy Service
After=network.target
[Service]
Type=simple
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/proxy
ExecStart=/usr/bin/kube-proxy \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \
$KUBE_MASTER \
$KUBE_PROXY_ARGS
Restart=always
LimitNOFILE=65536
[Install]
WantedBy=default.target
vim /etc/kubernetes/proxy
###
# kubernetes proxy config
# defaults from config and proxy should be adequate
# Add your own!
KUBE_PROXY_ARGS="--kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig"
systemctl daemon-reload
systemctl enable kube-proxy
systemctl start kube-proxy
systemctl status kube-proxy
#
ls -l /etc/kubernetes/kubernetesTLS/
能夠從文件夾中看出,kubelet服務啓動以後,自動響應生成了這三個文件:kubelet-client.key.tmp kubelet.crt kubelet.key。
若是須要從新部署kubelet服務,那麼就須要刪除這三個文件便可。否則會提示過時,服務啓動異常。
另外,能夠看到kubelet-client.key.tmp該文件尚未亮色,不能夠運行起來,緣由是kubelet向apiserver發出CSR認證的請求,此時apiserver尚未認證經過。
那麼下一步就須要回到master服務認證csr。