ubuntu20.10 server+docker20.10.6+k8s1.21.0
1养渴、所有節(jié)點(diǎn)店煞,這里是3臺vm秧饮,分別改hostname
改hostname:vi /etc/hostname
hostname k8s-master131
建議把hostname對應(yīng)的IP寫進(jìn)/etc/hosts文件,以便dns解析
cat >> /etc/hosts <<EOF
192.168.21.131 k8s-master131
192.168.21.132 k8s-node132
192.168.31.133 k8s-node133
EOF
2浮驳、所有節(jié)點(diǎn)吁峻,這里是3臺vm滑负,分別配置IP
192.168.21.131 k8s-master131
192.168.21.132 k8s-node132
192.168.21.133 k8s-node133
/etc/netplan在张,根據(jù)個(gè)人環(huán)境的不同來編輯IP,我的環(huán)境yaml文件為:00-installer-config.yaml
network:
? ? ethernets:
? ? ? ? ens3:
? ? ? ? ? ? addresses: [192.168.21.131/24]
? ? ? ? ? ? gateway4: 192.168.21.254
? ? ? ? ? ? nameservers:
? ? ? ? ? ? ? ? ? ? addresses: [202.96.134.133矮慕,114.114.114.114]
? ? version: 2
3帮匾、修改為cst東八區(qū)時(shí)區(qū),校準(zhǔn)日期時(shí)間痴鳄。
date -R
tzselect
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
sudo date -s MM/DD/YY //修改日期
sudo date -s hh:mm:ss //修改時(shí)間
在修改時(shí)間以后瘟斜,修改硬件CMOS的時(shí)間
sudo hwclock --systohc
如果需要修改時(shí)間為24小時(shí),我們可以修改/etc/default/locale痪寻,默認(rèn)沒有LC_TIME這個(gè)變量螺句,我們在文件中增加一行,設(shè)置改變量如下:
cat /etc/default/locale
LANG=en_US.UTF-8
LC_TIME=en_DK.UTF-8
時(shí)間同步
ntpdate ntp.aliyun.com
4橡类、防火墻設(shè)置
查看當(dāng)前防火墻狀態(tài)
? 在Ubuntu中 我們使用sudo ufw status命令查看當(dāng)前防火墻狀態(tài);inactive狀態(tài)是防火墻關(guān)閉狀態(tài) active是開啟狀態(tài)蛇尚。
開啟防火墻
? 在Ubuntu中 我們使用sudo ufw enable命令來開發(fā)防火墻 通過sudo ufw status命令查看開啟防火墻后的狀態(tài)為active 說明防火墻開啟成功。
關(guān)閉防火墻
在Ubuntu中 我們使用sudo ufw disable命令來關(guān)閉防火墻顾画。執(zhí)行該命令之后 我們使用sudo ufw status命令來查看當(dāng)前防火墻的狀態(tài) 如果是inactive 說明我們的防火墻已經(jīng)關(guān)閉掉了取劫。
Ubuntu中其他常用的防火墻命令
ufw default allow/deny:外來訪問默認(rèn)允許/拒絕
ufw allow/deny 20:允許/拒絕 訪問20端口,20后可跟/tcp或/udp,表示tcp或udp封包研侣。
ufw allow/deny servicename:ufw從/etc/services中找到對應(yīng)service的端口谱邪,進(jìn)行過濾。
ufw allow proto tcp from 10.0.1.0/10 to 本機(jī)ip port 25:允許自10.0.1.0/10的tcp封包訪問本機(jī)的25端口庶诡。
ufw delete allow/deny 20:刪除以前定義的"允許/拒絕訪問20端口"的規(guī)則
例如開啟允許80端口被訪問惦银,如下圖所示
5、禁用swap
sudo swapoff -a
將文件系統(tǒng)設(shè)置為可讀寫
sudo mount -n -o remount,rw /
將文件中的swap行使用#注釋掉
sudo vim /etc/fstab
重啟電腦或exit后再進(jìn)灌砖。
reboot
6.使流量通過iptables
加載模塊
sudo modprobe br_netfilter
檢查是否加載
lsmod | grep br_netfilter
br_netfilter? ? ? ? ? 28672? 0
bridge? ? ? ? ? ? ? ? 200704? 1 br_netfilter
配置正確流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
應(yīng)用配置
sudo sysctl --system
7璧函、docker安裝
# step 1: 安裝必要的一些系統(tǒng)工具
apt-get update
apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# Step 2: 安裝GPG證書
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 寫入軟件源信息
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu$(lsb_release -cs)stable"
# Step 4: 更新并安裝v20.10.0版的Docker-CE
國內(nèi)源安裝指定的docker版本可參考:https://blog.csdn.net/weixin_41082546/article/details/106789673
apt-get -y update
查看源力包含哪些docker版本
apt-cache madison docker-ce
安裝指定的docker版本
格式為:
sudo apt-get install docker-ce=<VERSION>
例如:apt-get install docker-ce=5:20.10.6~3-0~ubuntu
docker version
# Step 5:配置鏡像加速
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://wvmqh31a.mirror.aliyuncs.com"]}EOF
.# Step 6:kubelet需要讓docker容器引擎使用systemd作為CGroup的驅(qū)動(dòng),其默認(rèn)值為cgroupfs基显,因而,我們還需要編輯docker的配置文件/etc/docker/daemon.json善炫,添加如下內(nèi)容撩幽。"exec-opts": ["native.cgroupdriver=systemd"]
因此daemon.json內(nèi)容如下:
{
? "registry-mirrors": ["https://wvmqh31a.mirror.aliyuncs.com"],
? "exec-opts": ["native.cgroupdriver=systemd"]
}
# Step 7:重新加載配置文件,然后重啟服務(wù)箩艺,并且設(shè)置為開機(jī)啟動(dòng)窜醉。
systemctl daemon-reload
systemctl restart docker
systemctlenabledocker
8、在各主機(jī)上生成kubelet和kubeadm等相關(guān)程序包的倉庫艺谆,這里使用阿里云鏡像源
# curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# cat <<EOF >/etc/apt/sources.list.d/kubernetes.listdeb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF# apt update
9榨惰、安裝kubelet、kubeadm静汤、kubectl琅催,并將kubelet設(shè)置為開機(jī)啟動(dòng)
# apt install kubelet=1.21.0-00 kubeadm=1.21.0-00 kubectl=1.21.0-00 -y
# systemctl enable kubelet
注: 安裝完成后居凶,要確保kubeadm等程序文件的版本,這將也是后面初始化Kubernetes集群時(shí)需要明確指定的版本號
10藤抡、初始化Master節(jié)點(diǎn)
# kubeadm init \
--apiserver-advertise-address=192.168.21.131 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.21.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--token-ttl=0
命令中的各選項(xiàng)簡單說明如下:
--apiserver-advertise-address:apiserver通告給其它組件的IP地址侠碧,一般應(yīng)該為Master節(jié)點(diǎn)用于集群內(nèi)部通信的IP地址
--image-repository:指定要使用的鏡像倉庫,默認(rèn)為gcr.io
kubernetes-version:kubernetes程序組件的版本號缠黍,必須要與前面安裝的版本一致
--service-cidr:集群內(nèi)部虛擬網(wǎng)絡(luò)弄兜,Pod統(tǒng)一訪問入口;service的網(wǎng)絡(luò)地址范圍瓷式,其值為CIDR格式的網(wǎng)絡(luò)地址替饿,默認(rèn)地址為10.96.0.0/12
--pod-network-cidr:Pod網(wǎng)絡(luò)的地址范圍,其值為CIDR格式的網(wǎng)絡(luò)地址贸典,通常视卢,F(xiàn)lannel網(wǎng)絡(luò)插件的默認(rèn)為10.244.0.0/16,Project Calico插件的默認(rèn)值為192.168.0.0/16瓤漏;本章使用的是calico插件腾夯,所以下面部署CNI網(wǎng)絡(luò)插件時(shí)需要與這里設(shè)置的保持一致。
--token-ttl:共享令牌(token)的過期時(shí)長蔬充,默認(rèn)為24小時(shí)蝶俱,0表示永不過期;為防止不安全存儲等原因?qū)е碌牧钆菩孤段<凹喊踩⒙ㄗh為其設(shè)定過期時(shí)長榨呆。未設(shè)定該選項(xiàng)時(shí),在token過期后庸队,若期望再向集群中加入其它節(jié)點(diǎn)积蜻,可以使用如下命令重新創(chuàng)建token,并生成節(jié)點(diǎn)加入命令彻消。
一般能順利把k8s系統(tǒng)自身kube-system組件的鏡像拉下來:
kube-apiserver
kube-proxy
kube-scheduler
kube-controller-manager
pause
coredns
etcd
也可以手動(dòng)docker pull下來竿拆,或者重tar包導(dǎo)入。
這里可能回用到:
docker pull
docker tag
docker load -i
11宾尚、設(shè)定kubectl
kubectl是kube-apiserver的命令行客戶端程序丙笋,實(shí)現(xiàn)了除系統(tǒng)部署之外的幾乎全部的管理操作,是kubernetes管理員使用最多的命令之一煌贴。kubectl需經(jīng)由API server認(rèn)證及授權(quán)后方能執(zhí)行相應(yīng)的管理操作御板,kubeadm部署的集群為其生成了一個(gè)具有管理員權(quán)限的認(rèn)證配置文件/etc/kubernetes/admin.conf,它可由kubectl通過默認(rèn)的"$HOME/.kube/config"的路徑進(jìn)行加載牛郑。當(dāng)然怠肋,用戶也可在kubectl命令上使用--kubeconfig選項(xiàng)指定一個(gè)別的位置。
下面復(fù)制認(rèn)證為Kubernetes系統(tǒng)管理員的配置文件至目標(biāo)用戶(例如當(dāng)前用戶root)的家目錄下淹朋,用于kubectl連接Kubernetes集群:
# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config
12笙各、下載calico.yaml钉答、修改對應(yīng)IP網(wǎng)段
wget https://docs.projectcalico.org/manifests/calico.yaml
# 下載完后還需要修改里面定義Pod網(wǎng)絡(luò)(CALICO_IPV4POOL_CIDR),與前面kubeadm init命令中使用的--pod-network-cidr選項(xiàng)指定的一樣
3672? ? ? ? ? ? - name: CALICO_IPV4POOL_CIDR
3673? ? ? ? ? ? ? value: "10.244.0.0/16"
kubectl apply -f calico.yaml
13酪惭、確認(rèn)部署網(wǎng)絡(luò)插件的Pod正常運(yùn)行狀態(tài)
# kubectl get pod -n kube-system -l k8s-app=calico-node
NAME? ? ? ? ? ? ? ? READY? STATUS? ? RESTARTS? AGE
calico-node-26s88? 1/1? ? Running? 0? ? ? ? ? 8m31s
calico-node-c2mpn? 1/1? ? Running? 0? ? ? ? ? 8m28s
calico-node-dhhg8? 1/1? ? Running? 0? ? ? ? ? 15m
14希痴、驗(yàn)證master節(jié)點(diǎn)已經(jīng)就緒
kubectl get nodes
15、添加Node節(jié)點(diǎn)到集群中
kubeadm join 192.168.21.131:6443 --token 19ovkd.gnzmwvarw3zocqgs \
>? ? ? ? --discovery-token-ca-cert-hash sha256:4109f5d6d92c94a6c36814cf0f1ae53a885369fb3d4652f67cca9b5ec436ff89
16春感、配置kubectl命令自動(dòng)補(bǔ)全功能
# echo "source <(kubectl completion bash)" >> ~/.profile
17砌创、驗(yàn)證
17.1 kubectl get cs;kubectl get node
17.2 kubectl create deployment nginx --image=nginx
從上面的返回結(jié)果中來看,新建的Pod轉(zhuǎn)態(tài)為"Running"鲫懒,并且就緒嫩实。表示運(yùn)行正常。
驗(yàn)證Pod網(wǎng)絡(luò)通信:
17.3 kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
? ? 17.4 驗(yàn)證DNS解析
使用busybox:1.28.4鏡像創(chuàng)建一個(gè)pod,用于dns解析上面創(chuàng)建的service名稱
kubectl run -it --rm --image=busybox:1.28.4 sh
18镊尺、部署Dashboard
18.1 下載配置清單文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
18.2 修改相關(guān)內(nèi)容
18.3 應(yīng)用配置清單文件,創(chuàng)建相關(guān)資源
kubectl apply -f recommended.yaml
18.4訪問Dashboard
打開瀏覽器宋彼,輸入集群中任意節(jié)點(diǎn)的IP以https://NodeIP:30001格式訪問
18.5 生成token
root@k8s-master131:~# kubectl get ClusterRole|grep -i cluster-admin
cluster-admin? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2021-04-12T17:09:47Z
18.6創(chuàng)建service account并綁定默認(rèn)cluster-admin管理員集群角色:
創(chuàng)建用戶:
kubectl create serviceaccount dashboard-admin -n kube-system
用戶授權(quán)旭愧,把dashboard-admin用戶與cluster-admin管理員集群角色綁定:
kubectl create clusterrolebinding dashboard-admin-binding --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# 獲取用戶token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
也可以通過yaml文件創(chuàng)建:
授予Dashboard賬戶集群管理權(quán)限
要讓dashboard可以訪問集群的各種資源,需要給dashboard賬戶賦予權(quán)限宙暇,這一步很關(guān)鍵,如果你缺少這一步的話议泵,你打開dashboard后會報(bào)很多forbidden占贫,如下:
configmaps is forbidden: User "system:serviceaccount:kube-system:service-controller" cannot list resource "configmaps" in API group "" in the namespace "default"
close
warning
persistentvolumeclaims is forbidden: User "system:serviceaccount:kube-system:service-controller" cannot list resource "persistentvolumeclaims" in API group "" in the namespace "default"
close
warning
....
要獲得管理集群的權(quán)限,新建admin-user-admin.rbac.yaml文件先口,內(nèi)容如下
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
---
# Create ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
執(zhí)行
[root@master] ~$ kubectl create -f admin-user-admin.rbac.yaml
找到admin-user-admin的token型奥,記下這串token瞳收,等下登錄的時(shí)候會使用,這個(gè)token默認(rèn)是永久的厢汹。
[root@master] ~$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')