集群規(guī)劃:
2臺(tái)master(高可用) | 2臺(tái)node (配置方面node要跑應(yīng)用所以盡量配置高一點(diǎn),master比node低一點(diǎn))
因?yàn)閷?shí)驗(yàn)環(huán)境直接啟4個(gè)虛擬機(jī)吃不消,所以先搭建1臺(tái)master,2臺(tái)node,等后期在添加1臺(tái)master擴(kuò)容為高可用架構(gòu)。
K8S架構(gòu):
一-系統(tǒng)初始化設(shè)置
master執(zhí)行
1.在master添加hosts
cat >> /etc/hosts << EOF
192.168.1.222 k8s-master1
192.168.1.111 k8s-node1
192.168.1.112 k8s-node2
EOF
2.關(guān)閉防火墻
systemctl stop firewalld
systemctl disable firewalld
3.關(guān)閉selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 臨時(shí)
4.關(guān)閉swap
swapoff -a # 臨時(shí)
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
5.根據(jù)規(guī)劃設(shè)置主機(jī)名
hostnamectl set-hostname <hostname>
6. 將橋接的IPv4流量傳遞到iptables的鏈
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system # 生效
7. 時(shí)間同步
yum install ntpdate -y
ntpdate time.windows.com
剩下的node節(jié)點(diǎn)機(jī)器,除了第一步以外,都執(zhí)行相同的操作。(node節(jié)點(diǎn)很多的情況下推薦ansible)
ansible方法:
ansible -hosts文件
[node]
192.168.1.111 name=k8s-node1
192.168.1.112 name=k8s-node2
playbook.yml
---
- hosts: node
gather_facts: no
tasks:
- name: 關(guān)閉防火墻
systemd: name=firewalld state=stopped enabled=no
- name: 關(guān)閉sellinux
shell: sed -i 's/enforcing/disabled/' /etc/selinux/config
- name: 關(guān)閉swp
shell: sed -ri 's/.*swap.*/#&/' /etc/fstab
- name: 時(shí)間同步
yum: name=ntpdate state=installed
- name: 執(zhí)行時(shí)間同步
shell: ntpdate time.windows.com
- name: 拷貝修改參數(shù)腳本
copy: src=edit_sysctl.sh dest=/root/
- name: 運(yùn)行腳本
shell: sh /root/edit_sysctl.sh
- name: 設(shè)置主機(jī)名
tags: hostname
shell: hostnamectl set-hostname {{ name }}
#{{ name }}為ansible內(nèi)置變量,vaule代表hosts定義主機(jī)的name 變量的值
edit_sysctl.sh腳本
#!/bin/bash
# 將橋接的IPv4流量傳遞到iptables的鏈
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
二-搭建ECTD集群
Etcd 是一個(gè)分布式鍵值存儲(chǔ)系統(tǒng),Kubernetes使用Etcd進(jìn)行數(shù)據(jù)存儲(chǔ),所以先準(zhǔn)備一個(gè)Etcd數(shù)據(jù)庫,為解決Etcd單點(diǎn)故障,應(yīng)采用集群方式部署,這里使用3臺(tái)組建集群,可容忍1臺(tái)機(jī)器故障.
注意:ectd 為了節(jié)省機(jī)器,這里與K8s節(jié)點(diǎn)機(jī)器復(fù)用。也可以獨(dú)立于k8s集群之外部署,只要apiserver能連接到就行。
1.準(zhǔn)備cfssl證書生成工具
這里是在k8s-master上執(zhí)行的
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
2.生成etcd證書
2-1.自簽證書頒發(fā)機(jī)構(gòu)(CA)
創(chuàng)建工作目錄
mkdir -p ~/TLS/{etcd,k8s}
cd TLS/etcd
自簽一個(gè)CA:
cat > ca-config.json << EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"www": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
cat > ca-csr.json << EOF
{
"CN": "etcd CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing"
}
]
}
EOF
生成證書:
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
#ls *pem
#ca-key.pem ca.pem
2-2.使用自簽好的CA簽發(fā)ETCD HTTPS證書
創(chuàng)建證書申請文件
cat > server-csr.json << EOF
{
"CN": "etcd",
"hosts": [
"192.168.1.222",
"192.168.1.111",
"192.168.1.112",
"192.168.1.113"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
EOF
注意:hosts那里可以理解為可信任的etcd IP,etcd集群所有etcd都要加進(jìn)去,為了擴(kuò)容方便我們還可以多加幾個(gè)預(yù)留IP。
生成證書:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
#ls server*pem
#server-key.pem server.pem
- 從Github下載ETCD二進(jìn)制文件
https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz
4.部署etcd集群
先部署一個(gè)節(jié)點(diǎn),在把整個(gè)etcd程序目錄和系統(tǒng)system配置文件拷貝到其他節(jié)點(diǎn) ,節(jié)省時(shí)間。這里先操作master
4-1. 創(chuàng)建工作目錄,解壓二進(jìn)制包--etcd/bin
mkdir -p /root/k8s/etcd{bin,cfg,ssl}
tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
mv etcd-v3.4.9-linux-amd64/{etcd,etcdctl} /root/k8s/etcd/bin/ #現(xiàn)將啟動(dòng)程序挪過去
4-2.創(chuàng)建etcd配置文件 ---etcd/cfg
cat > /root/k8s/etcd/cfg/etcd.conf << EOF
#[Member]
ETCD_NAME="etcd-1"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.1.222:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.1.222:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.1.222:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.1.222:2379"
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.1.222:2380,etcd-2=https://192.168.1.111:2380,etcd-3=https://192.168.1.112:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF
說明:
- ETCD_NAME:節(jié)點(diǎn)名稱,集群中唯一
- ETCD_DATA_DIR:數(shù)據(jù)目錄
- ETCD_LISTEN_PEER_URLS:集群通信監(jiān)聽地址
- ETCD_LISTEN_CLIENT_URLS:客戶端訪問監(jiān)聽地址
- ETCD_INITIAL_ADVERTISE_PEER_URLS:集群通告地址
- ETCD_ADVERTISE_CLIENT_URLS:客戶端通告地址
- ETCD_INITIAL_CLUSTER:集群節(jié)點(diǎn)地址
- ETCD_INITIAL_CLUSTER_TOKEN:集群Token
- ETCD_INITIAL_CLUSTER_STATE:加入集群的當(dāng)前狀態(tài),new是新集群,existing表示加入已有集群
4-3. 將開始生成的etcd證書拷貝過來 --etcd/ssl
cp /root/TLS/etcd/ca*pem /root/TLS/etcd/server*pem /root/k8s/etcd/ssl/
4-4.將etcd配置成system系統(tǒng)服務(wù)
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=/root/k8s/etcd/cfg/etcd.conf
ExecStart=/root/k8s/etcd/bin/etcd \
--name=${ETCD_NAME} \
--data-dir=${ETCD_DATA_DIR} \
--listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \
--listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \
--advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \
--initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
--initial-cluster=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-token=${ETCD_INITIAL_CLUSTER_TOKEN} \
--initial-cluster-state=new \
--cert-file=/root/k8s/etcd/ssl/server.pem \
--key-file=/root/k8s/etcd/ssl/server-key.pem \
--peer-cert-file=/root/k8s/etcd/ssl/server.pem \
--peer-key-file=/root/k8s/etcd/ssl/server-key.pem \
--trusted-ca-file=/root/k8s/etcd/ssl/ca.pem \
--peer-trusted-ca-file=/root/k8s/etcd/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
4-5. 啟動(dòng)并設(shè)置開機(jī)啟動(dòng)
systemctl daemon-reload
systemctl start etcd
systemctl enable etcd
注意:直接啟動(dòng)第一個(gè)節(jié)點(diǎn)上的etcd會(huì)卡著不動(dòng),這是因?yàn)槠渌?jié)點(diǎn)還沒啟動(dòng),他在等待鏈接,超時(shí)狀態(tài)。
如果啟動(dòng)失敗,直接查看日志/var/log/message 或 journalctl -u etcd
4-6. 將etcd程序文件目錄和sys管理配置文件拷貝到其他etcd節(jié)點(diǎn),并修該etcd.conf 為各自的IP
機(jī)器數(shù)量多可以用ansbile
---
- hosts: node
gather_facts: no
tasks:
- name: 為etcd節(jié)點(diǎn)創(chuàng)建工作目錄
file: name=/root/k8s state=directory
- name: 拷貝etcd程序目錄
copy: src=/root/k8s/etcd dest=/root/k8s/
- name: 拷貝system文件
tags: sys
copy: src=/usr/lib/systemd/system/etcd.service dest=/usr/lib/systemd/system/
修改etcd.conf(所有node都要改為自己的IP,ETCD_NAME)
最后同上一樣,啟動(dòng)服務(wù)。
systemctl daemon-reload
systemctl start etcd
systemctl enable etcd
4.7-查看etcd集群狀態(tài)(寫成了sh,方便查看)
#!/bin/bash
WORKDIR=/root/k8s
server_1=192.168.1.222
server_2=192.168.1.111
server_3=192.168.1.112
ETCDCTL_API=3 $WORKDIR/etcd/bin/etcdctl --cacert=$WORKDIR/etcd/ssl/ca.pem --cert=$WORKDIR/etcd/ssl/server.pem --key=$WORKDIR/etcd/ssl/server-key.pem --endpoints="https://${server_1}:2379,https://${server_2}:2379,https://${server_3}:2379" endpoint health
etcd集群啟動(dòng)成功,搭建完成。
三. 安裝Docker
各個(gè)節(jié)點(diǎn)安裝docker,這里直接yum裝就可以
yum install -y yum-utils
#阿里云鏡像倉庫
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum軟件包索引
yum makecache fase
#安裝docker
yum install docker-ce
#配置阿里鏡像加速器
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
#啟動(dòng)docker
systemctl start docker
四. 部署Master Node
1.生成kube-apiserver證書
1-1.自簽證書頒發(fā)機(jī)構(gòu)(CA)
切換到開始創(chuàng)建的TLS目錄下,cd /root/TLS/k8s
cat > ca-config.json << EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
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 -
#ls *pem
#ca-key.pem ca.pem
1-2.使用自簽CA簽發(fā)kube-apiserver HTTPS證書
創(chuàng)建證書申請文件
注意:hosts字段仍然代表可信任的主機(jī)列表,這里要寫所有Master、LB/VIP IP ,一個(gè)都不能少,方便后期擴(kuò)容建議多寫幾個(gè)預(yù)留IP,在部署前期一定要將IP 以及角色都規(guī)劃好。(222,252為master ip,188,199為預(yù)留VIP ip)
cat > server-csr.json << EOF
{
"CN": "kubernetes",
"hosts": [
"10.0.0.1",
"127.0.0.1",
"192.168.1.222",
"192.168.1.252",
"192.168.1.188",
"192.168.1.199",
"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 server-csr.json | cfssljson -bare server
#ls server*pem
#server-key.pem server.pem
2.下載并解壓二進(jìn)包
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md#v1183
注意:打開鏈接你會(huì)發(fā)現(xiàn)里面有很多包,下載一個(gè)server包就夠了,包含了Master和Worker Node二進(jìn)制文件。
mkdir -p /root/k8s/kubernetes/{bin,cfg,ssl,logs}
tar zxvf kubernetes-server-linux-amd64.tar.gz
cd kubernetes/server/bin
cp kube-apiserver kube-scheduler kube-controller-manager /opt/kubernetes/bin
cp kubectl /usr/bin/
3.部署kube-apiserver
3-1.創(chuàng)建配置文件
cat > /root/k8s/kubernetes/cfg/kube-apiserver.conf << EOF
KUBE_APISERVER_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/root/k8s/kubernetes/logs \
--etcd-servers=https://192.168.1.222:2379,https://192.168.1.111:2379,https://192.168.1.112:2379 \
--bind-address=192.168.1.222 \
--secure-port=6443 \
--advertise-address=192.168.1.222 \
--allow-privileged=true \
--service-cluster-ip-range=10.0.0.0/24 \
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \
--authorization-mode=RBAC,Node \
--enable-bootstrap-token-auth=true \
--token-auth-file=/root/k8s/kubernetes/cfg/token.csv \
--service-node-port-range=30000-32767 \
--kubelet-client-certificate=/root/k8s/kubernetes/ssl/server.pem \
--kubelet-client-key=/root/k8s/kubernetes/ssl/server-key.pem \
--tls-cert-file=/root/k8s/kubernetes/ssl/server.pem \
--tls-private-key-file=/root/k8s/kubernetes/ssl/server-key.pem \
--client-ca-file=/root/k8s/kubernetes/ssl/ca.pem \
--service-account-key-file=/root/k8s/kubernetes/ssl/ca-key.pem \
--etcd-cafile=/root/k8s/etcd/ssl/ca.pem \
--etcd-certfile=/root/k8s/etcd/ssl/server.pem \
--etcd-keyfile=/root/k8s/etcd/ssl/server-key.pem \
--audit-log-maxage=30 \
--audit-log-maxbackup=3 \
--audit-log-maxsize=100 \
--audit-log-path=/root/k8s/kubernetes/logs/k8s-audit.log"
注:上面兩個(gè)\ \ 第一個(gè)是轉(zhuǎn)義符,第二個(gè)是換行符,使用轉(zhuǎn)義符是為了使用EOF保留換行符。
#配置文件解釋
--logtostderr:啟用日志
--v:日志等級(jí)
--log-dir:日志目錄
--etcd-servers:etcd集群地址
--bind-address:監(jiān)聽地址
--secure-port:https安全端口
--advertise-address:集群通告地址
--allow-privileged:啟用授權(quán)
--service-cluster-ip-range:Service虛擬IP地址段
--enable-admission-plugins:準(zhǔn)入控制模塊
--authorization-mode:認(rèn)證授權(quán),啟用RBAC授權(quán)和節(jié)點(diǎn)自管理
--enable-bootstrap-token-auth:啟用TLS bootstrap機(jī)制
--token-auth-file:bootstrap token文件
--service-node-port-range:Service nodeport類型默認(rèn)分配端口范圍
--kubelet-client-xxx:apiserver訪問kubelet客戶端證書
--tls-xxx-file:apiserver https證書
--etcd-xxxfile:連接Etcd集群證書
--audit-log-xxx:審計(jì)日志
3-2.將前面生成的在TSL/k8s下生成的證書拷貝到配置文件路徑
cp /root/TLS/k8s/server*pem /root/TLS/k8s/ca*pem /root/k8s/kubernetes/ssl/
3-3. 啟動(dòng)TLS Bootstrapping 機(jī)制
說明: TLS Bootstraping:Master apiserver啟用TLS認(rèn)證后,Node節(jié)點(diǎn)kubelet和kube-proxy要與kube-apiserver進(jìn)行通信,必須使用CA簽發(fā)的有效證書才可以,當(dāng)Node節(jié)點(diǎn)很多時(shí),這種客戶端證書頒發(fā)需要大量工作,同樣也會(huì)增加集群擴(kuò)展復(fù)雜度。為了簡化流程,Kubernetes引入了TLS bootstraping機(jī)制來自動(dòng)頒發(fā)客戶端證書,kubelet會(huì)以一個(gè)低權(quán)限用戶自動(dòng)向apiserver申請證書,kubelet的證書由apiserver動(dòng)態(tài)簽署。所以強(qiáng)烈建議在Node上使用這種方式,目前主要用于kubelet,kube-proxy還是由我們統(tǒng)一頒發(fā)一個(gè)證書。
創(chuàng)建上述配置文件中token文件:
#生成token
head -c 16 /dev/urandom | od -An -t x | tr -d ' '
#創(chuàng)建token文件
cat > /root/k8s/kubernetes/cfg/token.csv << EOF
54c2956999675c60a4d8fd821d68edee,kubelet-bootstrap,10001,"system:node-bootstrapper"
EOF
#授權(quán)kubelet-bootstrap用戶允許請求證書
kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap
3-4. 將apiserver加入system系統(tǒng)服務(wù)管理, 啟動(dòng)服務(wù)
cat > /usr/lib/systemd/system/kube-apiserver.service << EOF
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=/root/k8s/kubernetes/cfg/kube-apiserver.conf
ExecStart=/root/k8s/kubernetes/bin/kube-apiserver \$KUBE_APISERVER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start kube-apiserver
systemctl enable kube-apiserver
4.部署kube-controller-manager
4-1.創(chuàng)建配置文件
cat > /root/k8s/kubernetes/cfg/kube-controller-manager.conf << EOF
KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/root/k8s/kubernetes/logs \
--leader-elect=true \
--master=127.0.0.1:8080 \
--bind-address=127.0.0.1 \
--allocate-node-cidrs=true \
--cluster-cidr=10.244.0.0/16 \
--service-cluster-ip-range=10.0.0.0/24 \
--cluster-signing-cert-file=/root/k8s/kubernetes/ssl/ca.pem \
--cluster-signing-key-file=/root/k8s/kubernetes/ssl/ca-key.pem \
--root-ca-file=/root/k8s/kubernetes/ssl/ca.pem \
--service-account-private-key-file=/root/k8s/kubernetes/ssl/ca-key.pem \
--experimental-cluster-signing-duration=87600h0m0s"
EOF
–master:通過本地非安全本地端口8080連接apiserver。
–leader-elect:當(dāng)該組件啟動(dòng)多個(gè)時(shí),自動(dòng)選舉(HA)
–cluster-signing-cert-file/–cluster-signing-key-file:自動(dòng)為kubelet頒發(fā)證書的CA,與apiserver保持一致
4-2. 將kube-controller-manager加入系統(tǒng)服務(wù), 啟動(dòng)服務(wù)
cat > /usr/lib/systemd/system/kube-controller-manager.service << EOF
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=/root/k8s/kubernetes/cfg/kube-controller-manager.conf
ExecStart=/root/k8s/kubernetes/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start kube-controller-manager
systemctl enable kube-controller-manager
5. 部署kube-scheduler
5-1.創(chuàng)建配置文件
cat > /root/k8s/kubernetes/cfg/kube-scheduler.conf << EOF
KUBE_SCHEDULER_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/roo/k8s/kubernetes/logs \
--leader-elect \
--master=127.0.0.1:8080 \
--bind-address=127.0.0.1"
EOF
--master:通過本地非安全本地端口8080連接apiserver。
--leader-elect:當(dāng)該組件啟動(dòng)多個(gè)時(shí),自動(dòng)選舉(HA)
5-2.將scheduler加入到系統(tǒng)服務(wù),啟動(dòng)服務(wù)
cat > /usr/lib/systemd/system/kube-scheduler.service << EOF
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=/root/k8s/kubernetes/cfg/kube-scheduler.conf
ExecStart=/root/k8s/kubernetes/bin/kube-scheduler \$KUBE_SCHEDULER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start kube-scheduler
systemctl enable kube-scheduler
6.查詢集群狀態(tài)
到此,Master Node上的組件全部部署完了,讓我們看下集群的狀態(tài)
kubectl get cs
五. 部署Worker Node
這里還是在master node 操作,222這臺(tái)機(jī)器即作為master又作為node, 后面部署其他節(jié)點(diǎn)worker node思路跟前面etcd類似,都是將一臺(tái)部署好,另外的將文件復(fù)制過去改改配置文件
1. 創(chuàng)建工作目錄并拷貝二進(jìn)制文件
在所有worker node執(zhí)行 (這里master這臺(tái)已經(jīng)執(zhí)行過了,111,112 執(zhí)行)
mkdir -p /root/k8s/kubernetes/{bin,cfg,ssl,logs}
從master節(jié)點(diǎn)拷貝到worker節(jié)點(diǎn):
cd /root/k8s/kubernetes/server/bin
cp kubelet kube-proxy /root/k8s/kubernetes/bin/ #本地拷貝
2.部署kubelet
2-1.創(chuàng)建配置文件
cat > /root/k8s/kubernetes/cfg/kubelet.conf << EOF
KUBELET_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/root/k8s/kubernetes/logs \
--hostname-override=k8s-master \
--network-plugin=cni \
--kubeconfig=/root/k8s/kubernetes/cfg/kubelet.kubeconfig \
--bootstrap-kubeconfig=/root/k8s/kubernetes/cfg/bootstrap.kubeconfig \
--config=/root/k8s/kubernetes/cfg/kubelet-config.yml \
--cert-dir=/root/k8s/kubernetes/ssl \
--pod-infra-container-image=lizhenliang/pause-amd64:3.0"
--hostname-override:顯示名稱,集群中唯一
--network-plugin:啟用CNI
--kubeconfig:空路徑,會(huì)自動(dòng)生成,后面用于連接apiserver
--bootstrap-kubeconfig:首次啟動(dòng)向apiserver申請證書
--config:配置參數(shù)文件
--cert-dir:kubelet證書生成目錄
--pod-infra-container-image:管理Pod網(wǎng)絡(luò)容器的鏡像
2-2.配置參數(shù)文件
cat > /root/k8s/kubernetes/cfg/kubelet-config.yml << EOF
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 0.0.0.0
port: 10250
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS:
- 10.0.0.2
clusterDomain: cluster.local
failSwapOn: false
authentication:
anonymous:
enabled: false
webhook:
cacheTTL: 2m0s
enabled: true
x509:
clientCAFile: /root/k8s/kubernetes/ssl/ca.pem
authorization:
mode: Webhook
webhook:
cacheAuthorizedTTL: 5m0s
cacheUnauthorizedTTL: 30s
evictionHard:
imagefs.available: 15%
memory.available: 100Mi
nodefs.available: 10%
nodefs.inodesFree: 5%
maxOpenFiles: 1000000
maxPods: 110
2-3.生成bootstrap.kubeconfig文件
下面是shell命令直接運(yùn)行
KUBE_APISERVER="https://192.168.1.222:6443" # apiserver IP:PORT
TOKEN="54c2956999675c60a4d8fd821d68edee" # 與token.csv里保持一致
# 生成 kubelet bootstrap kubeconfig 配置文件
kubectl config set-cluster kubernetes \
--certificate-authority=/root/k8s/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=bootstrap.kubeconfig
kubectl config set-credentials "kubelet-bootstrap" \
--token=${TOKEN} \
--kubeconfig=bootstrap.kubeconfig
kubectl config set-context default \
--cluster=kubernetes \
--user="kubelet-bootstrap" \
--kubeconfig=bootstrap.kubeconfig
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
執(zhí)行完會(huì)在當(dāng)前目錄生成 bootstrap.kubeconfig文件,將他拷貝到/root/k8s/kubernetes/cfg下
2-4.將kubelet加入服務(wù)啟動(dòng)
cat > /usr/lib/systemd/system/kubelet.service << EOF
[Unit]
Description=Kubernetes Kubelet
After=docker.service
[Service]
EnvironmentFile=/root/k8s/kubernetes/cfg/kubelet.conf
ExecStart=/root/k8s/kubernetes/bin/kubelet \$KUBELET_OPTS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start kubelet
systemctl enable kubelet
注意:
這里遇到了一個(gè)問題,開始kubelet是沒起來的,通過日志發(fā)現(xiàn)報(bào)錯(cuò):
通過docker info 發(fā)現(xiàn)我的docker cgroup driver是systemd(默認(rèn))。
解決方法:1.修改docker ,將daemon.json 把他的cgoup改成cgoupfs
2.修改kubelet-config.yml 將coupDriver改成systemd。 總之保證kubelet和docker引擎一直就可以。
2-5.批準(zhǔn)kubelet證書申請并加入集群
查看kubelet證書請求
**kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
node-csr-5oXsZ7Bt1OtMcHaT9_U_EApCjuUiMNnfHb74SHYyGkw 15m kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Approved,Issued
批準(zhǔn)申請 (最后面是證書請求的NAME)
kubectl certificate approve node-csr-5oXsZ7Bt1OtMcHaT9_U_EApCjuUiMNnfHb74SHYyGkw
查看節(jié)點(diǎn)
**kubectl get node
3.部署kube-proxy
3-1.創(chuàng)建配置文件
cat > /root/k8s/kubernetes/cfg/kube-proxy.conf << EOF
KUBE_PROXY_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/root/k8s/kubernetes/logs \\
--config=/root/k8s/kubernetes/cfg/kube-proxy-config.yml"
EOF
3-2.創(chuàng)建參數(shù)文件
cat > /root/k8s/kubernetes/cfg/kube-proxy-config.yml << EOF
kind: KubeProxyConfiguration
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: 0.0.0.0
metricsBindAddress: 0.0.0.0:10249
clientConnection:
kubeconfig: /root/k8s/kubernetes/cfg/kube-proxy.kubeconfig
hostnameOverride: k8s-master
clusterCIDR: 10.0.0.0/24
EOF
3-3.生成kube-proxy.kubeconfig文件
生成kube-proxy證書:
# 切換工作目錄
cd /root/TLS/k8s
# 創(chuàng)建證書請求文件
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
#ls kube-proxy*pem
#kube-proxy-key.pem kube-proxy.pem
生成kubeconfig文件:
KUBE_APISERVER="https://192.168.1.222:6443"
kubectl config set-cluster kubernetes \
--certificate-authority=/root/k8s/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=kube-proxy.kubeconfig
kubectl config set-credentials kube-proxy \
--client-certificate=./kube-proxy.pem \
--client-key=./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
拷貝到配置文件指定路徑:
cp kube-proxy.kubeconfig /root/k8s/kubernetes/cfg/
3-4.將kube-proxy加入到系統(tǒng)服務(wù),啟動(dòng)
cat > /usr/lib/systemd/system/kube-proxy.service << EOF
[Unit]
Description=Kubernetes Proxy
After=network.target
[Service]
EnvironmentFile=/root/k8s/kubernetes/cfg/kube-proxy.conf
ExecStart=/root/k8s/kubernetes/bin/kube-proxy \$KUBE_PROXY_OPTS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start kube-proxy
systemctl enable kube-proxy
六-部署CNI網(wǎng)絡(luò)
1.下載包
https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz
2.創(chuàng)建目錄
mkdir -p /root/k8s/cni/bin
cd /root/k8s/cni/bin
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C .
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
##sed -i -r "s#quay.io/coreos/flannel:.*-amd64#lizhenliang/flannel:v0.12.0-amd64#g" kube-flannel.yml
##如果鏡像地址無法訪問,修改可用的鏡像地址
會(huì)下載下來一個(gè)kube-flannel.yml
3.部署CNI網(wǎng)絡(luò)
kubectl apply -f kube-flannel.yml
kubectl get pods -n kube-system
kubectl get node
Node準(zhǔn)備就緒 (圖中calico是后來自己又另外應(yīng)用了一次calico網(wǎng)絡(luò)組件產(chǎn)出的)
4.授權(quán)apiserver訪問kubelet
cat > apiserver-to-kubelet-rbac.yaml << EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
labels:
kubernetes.io/bootstrapping: rbac-defaults
name: system:kube-apiserver-to-kubelet
rules:
- apiGroups:
- ""
resources:
- nodes/proxy
- nodes/stats
- nodes/log
- nodes/spec
- nodes/metrics
- pods/log
verbs:
- "*"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: system:kube-apiserver
namespace: ""
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:kube-apiserver-to-kubelet
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: kubernetes
EOF
kubectl apply -f apiserver-to-kubelet-rbac.yaml
新增Worker Node
1.拷貝已部署好的Node相關(guān)文件到新節(jié)點(diǎn)(111,112機(jī)器)
scp -r kubernetes root@192.168.1.111:/root/k8s/
scp -r /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@192.168.1.111:/usr/lib/systemd/system/
scp -r cni root@192.168.1.111:/root/k8s/
scp kubernetes/ssl/ca.pem root@192.168.1.111:/root/k8s/kubernetes/ssl/
- 刪除kubelet證書和kubeconfig文件
注:這幾個(gè)文件是證書申請審批后自動(dòng)生成的,每個(gè)Node不同,必須刪除重新生成。
rm kubernetes/cfg/kubelet.kubeconfig
rm -f kubernetes/ssl/kubelet*
3.修改node主機(jī)名(node節(jié)點(diǎn)運(yùn)行)
cd /root/k8s/kubernetes/cfg
vim kubelet.conf 修改hostname
--hostname-override=k8s-node1
vim kube-proxy-config.yml
hostnameOverride: k8s-node1
4.在node節(jié)點(diǎn)啟動(dòng)kubelet和kube-proxy服務(wù)
systemctl daemon-reload
systemctl start kubelet
systemctl enable kubelet
systemctl start kube-proxy
systemctl enable kube-proxy
- 在Master節(jié)點(diǎn)批準(zhǔn)新Node kubelet證書申請
kubectl get csr
kubectl certificate approve node-csr-4zTjsaVSrhuyhIGqsefxzVoZDCNKei-aE2jyTP81Uro
6.查看Node狀態(tài)
剩下的112 節(jié)點(diǎn)加入集群同上,只是hostname修改一下。
七. Dashboard和CoreDNS
Dashboard : 簡單UI
CoreDNS: k8s內(nèi)部的DNS服務(wù)
1.部署Dashboard
https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
默認(rèn)Dashboard只能集群內(nèi)部訪問,修改Service為NodePort類型,暴露到外部:
1-1.部署組件
kubectl apply -f kubernertes-dashboard.yaml
1-2.查看服務(wù)狀態(tài)
kubectl get pods,svc -n kubernetes-dashboard
1-3.訪問Dashboard:
https://192.168.1.222:30001
1-4.創(chuàng)建service account并綁定默認(rèn)cluster-admin管理員集群角色,并創(chuàng)建一個(gè)token登陸
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
2.部署CoreDNS
用于集群內(nèi)部service名稱解析
kubectl apply -f coredns.yaml
[root@k8s-master1 k8s] kubectl get pods -n kube-system|grep dns
coredns-58d8cd457b-frkh9 1/1 Running 0 55s
測試:
[root@k8s-master1 cfg]# kubectl run -it --rm dns-test --image=busybox:1.28.4 sh
If you don't see a command prompt, try pressing enter.
/ # nslookup kubernete
Server: 10.0.0.2