### 一、環境介紹
1.1 kubeadm介紹
kubeadm是官方社區推出的一個用於快速部署kubernetes集群的工具。
kubeadm采用的是容器化部署方式,組件除了kubelet
其他都以容器形式啟動並運行。
1.2 部署流程
- 安裝Docker
- 使用
kubeadm init
創建一個Master節點 - 使用
kubeadm join
將一個node節點加入到集群中 - 部署容器網絡
- 部署Web UI
1.3 安裝要求
在開始之前,部署Kubernetes集群機器需要滿足以下幾個條件:
- 一台或多台機器,操作系統 CentOS7.x-86_x64
- 硬件配置:2GB或更多RAM,2個CPU或更多CPU,硬盤30GB或更多
- 集群中所有機器之間網絡互通
- 可以訪問外網,需要拉取鏡像
- 禁止swap分區
1.4 k8s運行圖示
1.5 環境准備
1.更新內核
k8s對系統內核要求較高,最好使用較新版本的內核,我這里使用的是5.4版本的內核,更新內核操作如下
#查看當前內核版本
uname -r
uname -a
cat /etc/redhat-release
#添加yum源倉庫
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
#更新yum源倉庫
yum -y update
#查看可用的系統內核包
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
#安裝內核,注意先要查看可用內核,我安裝的是5.4版本的內核
yum --enablerepo=elrepo-kernel install kernel-lt
#查看目前可用內核
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
#使用序號為0的內核,序號0是前面查出來的可用內核編號
grub2-set-default 0
#生成 grub 配置文件並重啟
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
查看可用的系統內核包,可以看到有5.4跟5.14版本兩個內核,我安裝的是5.4版本的內核
查看目前可用內核
參考資料:升級內核
2.准備環境
用三台機器,一台master,兩台node作為實驗環境
角色 | IP |
---|---|
k8s-master01 | 10.154.0.111 |
k8s-node01 | 10.154.0.112 |
k8s-node02 | 10.154.0.113 |
以下命令除了設置主機名外,其他所有機器都要設置
#關閉防火牆,selinux
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
#關閉swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
#設置主機名
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02
#在master添加hosts
cat >> /etc/hosts << EOF
10.154.0.111 k8s-master01
10.154.0.112 k8s-node01
10.154.0.113 k8s-node02
EOF
#啟用IPv4模塊
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
#時間同步
yum install ntpdate -y
ntpdate time.windows.com
#重啟服務器
reboot
二、部署k8s集群
以下操作在所有節點進行,如果使用的xshell工具,可以使用工具-->發送鍵到所有會話
2.1 安裝Docker
這里我安裝的是目前最新版本v20.10.9,使用的yum源安裝的,也可以二進制安裝docker
2.2 安裝集群組件
1.添加阿里雲YUM軟件源
cat << EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
wget http://mirrors.aliyun.com/repo/Centos-7.repo -O /etc/yum.repos.d/CentOS-Base.repo
wget http://mirrors.aliyun.com/repo/epel-7.repo -O /etc/yum.repos.d/epel.repo
2.安裝kubeadm,kubelet和kubectl
目前最新版本是1.22.2,我們直接上最新版
yum install -y kubectl-1.22.2 kubelet-1.22.2 kubeadm-1.22.2
systemctl enable kubelet
2.3 部署Master節點
初始化有如下兩種方式
方式一:使用kubeadm init命令初始化
在k8s-Master01上執行,報錯請看k8s報錯匯總
kubeadm init \
--apiserver-advertise-address=10.154.0.111 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.22.2 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
- --apiserver-advertise-address 集群通告地址
- --image-repository 由於默認拉取鏡像地址k8s.gcr.io國內無法訪問,這里指定阿里雲鏡像倉庫地址
- --kubernetes-version K8s版本,與上面安裝的一致
- --service-cidr 集群內部虛擬網絡,Pod統一訪問入口
- --pod-network-cidr Pod網絡,,與下面部署的CNI網絡組件yaml中保持一致
- --ignore-preflight-errors=all 忽略一些檢查錯誤
執行完畢后會出現以下內容,第一個框內是將連接集群的配置文件拷貝到默認路徑下,第二個框內是加入集群命令kubeadm join,復制該命令在node節點執行就能加入該集群
#框一內容
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#框二內容
kubeadm join 10.154.0.111:6443 --token dtiqj4.z8xpk6hdio0e4mbu \
--discovery-token-ca-cert-hash sha256:7845faa23c64a2317d3bd059581635c7678d0f3a6b96c5b5db992d29f935485d
:'
kubeadm init初始化工作過程
1、[preflight] 環境檢查和拉取鏡像 kubeadm config images pull
2、[certs] 生成k8s證書和etcd證書 /etc/kubernetes/pki
3、[kubeconfig] 生成kubeconfig文件
4、[kubelet-start] 生成kubelet配置文件
5、[control-plane] 部署管理節點組件,用鏡像啟動容器 kubectl get pods -n kube-system
6、[etcd] 部署etcd數據庫,用鏡像啟動容器
7、[upload-config] [kubelet] [upload-certs] 上傳配置文件到k8s中
8、[mark-control-plane] 給管理節點添加一個標簽 node-role.kubernetes.io/master='',再添加一個污點[node-role.kubernetes.io/master:NoSchedule]
9、[bootstrap-token] 自動為kubelet頒發證書
10、[addons] 部署插件,CoreDNS、kube-proxy
'
方式二:使用配置文件引導
vi kubeadm.conf
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.22.2
imageRepository: registry.aliyuncs.com/google_containers
networking:
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
kubeadm init --config kubeadm.conf --ignore-preflight-errors=all
2.查看效果
此時就能使用kubectl管理集群了,查看集群狀態
kubectl get node
docker ps #可以看到集群實際上是拉起了很多容器
可以看到k8s-master01已經在集群中了
可以看到kube-system命名空間中的pod,命名空間跟pod概念以后講解
2.4 部署Node節點
在k8s-node01跟02上執行
1.將node節點加入集群
向集群添加新節點,執行在kubeadm init
輸出的kubeadm join
命令:
kubeadm join 10.154.0.111:6443 --token dtiqj4.z8xpk6hdio0e4mbu \
--discovery-token-ca-cert-hash sha256:7845faa23c64a2317d3bd059581635c7678d0f3a6b96c5b5db992d29f935485d
默認token有效期為24小時,當過期之后,該token就不可用了。這時就需要重新創建token。
2.重新創建token
重新創建token有兩種方式
方式一:一次性創建
kubeadm token create --print-join-command
方式二:分批創建
#創建token
$ kubeadm token create
w2ouca.erkyzzbw70xuxoqb
#創建token-ca-cert-hash
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
7845faa23c64a2317d3bd059581635c7678d0f3a6b96c5b5db992d29f935485d
#合起來就是加入集群命令
$ kubeadm join 10.154.0.111:6443 --token w2ouca.erkyzzbw70xuxoqb --discovery-token-ca-cert-hash 7845faa23c64a2317d3bd059581635c7678d0f3a6b96c5b5db992d29f935485d
#查看token列表
kubeadm token list
3.查看效果
這時node已經加入到集群中了,狀態為NotReady是因為沒有部署網絡插件導致的。
如果報錯查看kubelet日志
journalctl -u kubelet >error.log
vim error.log
參考資料:官方文檔
2.5 部署容器網絡
網絡組件有很多種,只需要部署其中一個即可,推薦Calico。
Calico是一個純三層的數據中心網絡方案,Calico支持廣泛的平台,包括Kubernetes、OpenStack等。
Calico 在每一個計算節點利用 Linux Kernel 實現了一個高效的虛擬路由器( vRouter) 來負責數據轉發,而每個 vRouter 通過 BGP 協議負責把自己上運行的 workload 的路由信息向整個 Calico 網絡內傳播。
此外,Calico 項目還實現了 Kubernetes 網絡策略,提供ACL功能。
1.下載Calico
目前最新版本為v3.20,按最新版本的來,不怕報錯,不怕困難,解決今天的報錯就是減少以后加班的時間,干就完了!
wget https://docs.projectcalico.org/v3.20/manifests/calico.yaml
2.修改calico.yaml
下載完后還需要修改里面定義Pod網絡(字段為CALICO_IPV4POOL_CIDR),與前面kubeadm init中定義的pod-network-cidr
網段一樣
#大約在3878行,取消注釋,並改為前面kubeadm init中pod-network-cidr字段定義的網段
vim calico.yaml +3878
...
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
...
3.修改完后應用清單
kubectl apply -f calico.yaml
kubectl get pods -n kube-system
我們看READY這一列,這里的1/1,左邊的1表示已經運行了的容器個數,右邊的1表示一共需要運行的容器個數。
calico.yaml也是以容器方式啟動的,以下是所需的容器
cat calico.yaml | grep image
2.6 部署 Dashboard
1.下載yaml文件
目前最新版本為v2.4.0,我先沖了各位!
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
2.修改資源類型
默認Dashboard只能集群內部訪問,修改Service為NodePort類型,暴露到外部30001端口
#加入下面的15行暴露3001端口,跟18行,對應配置文件的43跟46行
vi recommended.yaml
...
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
targetPort: 8443
nodePort: 30001
selector:
k8s-app: kubernetes-dashboard
type: NodePort
...
注意格式對齊
3.應用清單
kubectl apply -f recommended.yaml
kubectl get pods -n kubernetes-dashboard
kubectl get pods,svc -n kubernetes-dashboard
訪問地址:
容器內訪問:curl https://10.104.22.253:443
容器外訪問:https://10.154.0.111:30001
4.登錄UI
有兩種方式登錄,使用token或者kubeconfig登錄
下面使用token方式登錄
創建service account並綁定默認cluster-admin管理員集群角色:
# 創建用戶
kubectl create serviceaccount dashboard-admin -n kube-system
# 用戶授權
kubectl create clusterrolebinding dashboard-admin --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}')
使用輸出的token登錄Dashboard。
效果如下所示
2.7 驗證集群狀態
從以下三個方面驗證集群狀態
- 驗證Pod工作
- 驗證Pod網絡通信
- 驗證DNS解析
1.創建pod驗證
在Kubernetes集群中k8s-master01上創建一個pod,驗證是否正常運行:
#創建一個nginx容器
kubectl create deployment nginx --image=nginx
#將nginx端口暴露出來
kubectl expose deployment nginx --port=80 --type=NodePort
#查看
kubectl get pod,svc
可以看到暴露出來的訪問端口是30180
訪問地址:
容器內部訪問:crul http://10.99.175.88 (在集群內任意節點都能訪問,如k8s-master01,k8s-node01等等節點上)
容器外部訪問:http://10.154.0.111:30180
2.使用命令驗證
kubectl get pods -n kube-system
參考資料:官方文檔支持的網絡組件,官方文檔之網絡配置
三、查看集群命令
這里介紹幾個常見的查看集群狀態的命令
3.1 查看集群節點狀態
kubectl get node
這里部署了kubelet的節點都會被顯示出來,如果使用二進制安裝的話,master因為沒部署kubelet將不會被顯示出來,需要注意。
3.2 查看組件狀態
kubectl get cs
這里的警告表示在v1.19+版本,該命令要被棄用了
這里的cs是縮寫,全稱是componentstatuses,意為組件狀態
該命令是查看k8s資源,k8s資源有很多,resources意為資源
kubectl api-resources | more
第一列是資源的名字
第二列是縮寫
第三列是API組
第四列是否支持命名空間
3.3 查看api代理的URL
kubectl cluster-info
3.4 查看集群詳細信息
kubectl cluster-info dump |more
信息很多,以json格式輸出的,一般很少使用,常用的如下
kubectl describe node k8s-master
3.5 查看事件信息
kubectl get event
多久創建的節點,多久加入的節點都會記錄在事件里
3.6 查看資源信息
kubectl describe cs
查看組件狀態信息,其他k8s支持的資源可使用kubectl api-resources | more
命令查看
3.7 查看容器信息
kubectl get pods -n kube-system
3.8 查看服務狀態
kubectl get pod,svc