1. k8s簡(jiǎn)介與本文目的
1.1. 概述
k8s
本身涉及到大量的技術(shù)知識(shí)矫户,包括操作系統(tǒng)、網(wǎng)絡(luò)残邀、存儲(chǔ)皆辽、調(diào)度、分布式等方面的知識(shí)芥挣。在本文中驱闷,不會(huì)著重講解 Kubernetes
的詳細(xì)知識(shí)。而是嘗試去了解Kubernetes
的最基本的概念空免,并基于官方的kubeadmin
工具搭建一個(gè)簡(jiǎn)單的Kubernetes
集群空另。
k8s
是Kubernetes的簡(jiǎn)稱,來(lái)自Google蹋砚,是用于自動(dòng)部署扼菠、擴(kuò)展和管理“容器化應(yīng)用程序”的開源系統(tǒng)。簡(jiǎn)單地說就是:k8s 是一套服務(wù)器集群管理組件坝咐,k8s現(xiàn)在普遍用于管理集群節(jié)點(diǎn)上的容器娇豫。在學(xué)習(xí)k8s之前,我們應(yīng)該具備一定的docker容器基礎(chǔ)畅厢。
下面這張圖展示了一個(gè)Kubernetes
的一個(gè)典型的架構(gòu)圖
1.2. k8s的功能
- 自我修復(fù)
- 彈性伸縮:實(shí)時(shí)根據(jù)服務(wù)器并發(fā)情況冯痢,實(shí)現(xiàn)自動(dòng)增加或縮減容器數(shù)量
- 自動(dòng)部署
- 回滾
- 服務(wù)發(fā)現(xiàn)和負(fù)載均衡
- 機(jī)密和配置共享管理
1.3. k8s的相關(guān)組件
主控制節(jié)點(diǎn)(master node): master節(jié)點(diǎn)需要安裝以下組件:
- apiserver: 用于接收客戶端操作k8s的指令
- schduler: 從多個(gè)woker節(jié)點(diǎn)組件中選舉一個(gè)來(lái)啟動(dòng)服務(wù)
- controller manger: 向worker節(jié)點(diǎn)的kubelet組件發(fā)送指令
工作節(jié)點(diǎn)(worker node): 工作節(jié)點(diǎn),worker節(jié)點(diǎn)需要安裝以下組件:
- kubenet:向docker發(fā)送指令管理docker容器
- kubeproxy:管理docker容器的網(wǎng)絡(luò)
1.4. k8s的核心概念
- Controllers:控制器,控制pod浦楣,啟動(dòng)袖肥、停止、刪除
- ReplicaSet
- Deployment
- StatefulSet
- DaemonSet
- Job
- Cronjob
- service:服務(wù)
將一組pod關(guān)聯(lián)起立振劳,提供一個(gè)統(tǒng)一的入口椎组,即使pod地址發(fā)生改變,這個(gè)統(tǒng)一入口也不會(huì)變化历恐,可以保證用戶訪問不受影響
label:標(biāo)簽
一組pod是一個(gè)統(tǒng)一的標(biāo)簽寸癌,service是通過標(biāo)簽和一組pod進(jìn)行關(guān)聯(lián)的namespace:名稱空間
用來(lái)隔離pod的運(yùn)行環(huán)境【默認(rèn)情況下,pod是可以互相訪問】弱贼,使用場(chǎng)景蒸苇,為不同的公司提供隔離的pod運(yùn)行環(huán)境,為開發(fā)環(huán)境吮旅、測(cè)試環(huán)境溪烤、生產(chǎn)環(huán)境分別準(zhǔn)備不同的名稱空間,進(jìn)行隔離
1.5. 目標(biāo)
在學(xué)習(xí)使用kubernetes
來(lái)管理你的容器應(yīng)用之前庇勃,應(yīng)當(dāng)擁有一個(gè)Kubernetes
集群環(huán)境檬嘀。那么第一步就是自己搭建一個(gè)集群環(huán)境,本著這個(gè)目的责嚷,在下文中我們一起探討怎樣搭建一個(gè)虛擬機(jī)的Kubernetes
集群鸳兽。
本次我們將部署一個(gè)主節(jié)點(diǎn)(master1)和兩個(gè)工作節(jié)點(diǎn)(worker1、worker2)的集群罕拂。為了節(jié)省電腦資源揍异,master1、worker1聂受、worker2每個(gè)節(jié)點(diǎn)分配2個(gè)cpu蒿秦、2G內(nèi)存、10G硬盤蛋济。這也是保證Kubernetes
正常運(yùn)行的的最低配置棍鳖,但這些配置完全足夠我們用以學(xué)習(xí)。接下來(lái)我們將在root
用戶下碗旅,進(jìn)行相關(guān)的操作渡处。
2. 準(zhǔn)備環(huán)境
2.1. 創(chuàng)建Ubuntu Server 20.04虛擬機(jī)
分別創(chuàng)建2核cpu、10G硬盤祟辟、2G內(nèi)存医瘫,名為master1、worker1旧困、worker2三臺(tái)虛擬機(jī)
2.1.1. 使用multipass創(chuàng)建
multipass launch -c 2 -d 10G -m 2G -n master1 20.04
multipass launch -c 2 -d 10G -m 2G -n worker1 20.04
multipass launch -c 2 -d 10G -m 2G -n worker2 20.04
使用multipass list
查詢創(chuàng)建的虛擬機(jī)列表醇份,如下
pan@pandeMacBook-Pro ~ % multipass list
Name State IPv4 Image
master1 Running 192.168.64.8 Ubuntu 18.04 LTS
worker1 Running 192.168.64.11 Ubuntu 18.04 LTS
worker2 Running 192.168.64.12 Ubuntu 18.04 LTS
通過以下指令進(jìn)入虛擬機(jī)中
# 進(jìn)入master1主機(jī)
multipass shell master1
2.1.2. 使用vagrant創(chuàng)建
定義Vagrantfile
稼锅,如下內(nèi)容
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/focal64"
config.disksize.size = '10GB'
# master1
config.vm.define "master1" do |master1|
master1.vm.network "public_network", ip: "192.168.33.10"
master1.vm.hostname = "master1"
# 將宿主機(jī)../data目錄掛載到虛擬機(jī)/vagrant_dev目錄
master1.vm.synced_folder "../data", "/vagrant_data"
# 指定核心數(shù)和內(nèi)存
config.vm.provider "virtualbox" do |v|
v.memory = 2048
v.cpus = 2
end
end
# worker1
config.vm.define "worker1" do |worker1|
worker1.vm.network "public_network", ip: "192.168.33.11"
worker1.vm.hostname = "worker1"
# 將宿主機(jī)../data目錄掛載到虛擬機(jī)/vagrant_pro目錄
worker1.vm.synced_folder "../data", "/vagrant_data"
# 指定核心數(shù)和內(nèi)存
config.vm.provider "virtualbox" do |v|
v.memory = 2048
v.cpus = 2
end
end
# worker2
config.vm.define "worker2" do |worker2|
worker2.vm.network "public_network", ip: "192.168.33.12"
worker2.vm.hostname = "worker2"
# 將宿主機(jī)../data目錄掛載到虛擬機(jī)/vagrant_pro目錄
worker2.vm.synced_folder "../data", "/vagrant_data"
# 指定核心數(shù)和內(nèi)存
config.vm.provider "virtualbox" do |v|
v.memory = 2048
v.cpus = 2
end
end
end
使用vagrant status
命令查看當(dāng)前虛擬機(jī)的狀態(tài),可以看到如下內(nèi)容
pan@pan-PC ~/Work/vagrant/kubernetes$ vagrant status
Current machine states:
master1 running (virtualbox)
worker1 running (virtualbox)
worker2 running (virtualbox)
This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.
通過以下指令進(jìn)入虛擬機(jī)中
# 進(jìn)入master1主機(jī)
vagrant ssh master1
2.2. 修改root用戶密碼
為了方便使用root用戶僚纷,我們對(duì)每一臺(tái)虛擬機(jī)進(jìn)行密碼修改操作
# 修改root密碼矩距,這里我都改為123456
sudo passwd root
# 修改密碼之后,直接使用su命令切換 root用戶
su
2.3. 關(guān)閉防火墻和iptables
根據(jù)官方文檔怖竭,防火墻和iptables可能會(huì)影響到k8s集群锥债,所以我們需要將每一臺(tái)主機(jī)的防火墻關(guān)閉掉
# 關(guān)閉防火墻
ufw disable
# 關(guān)閉iptables
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
3. 安裝docker與kubeadm
因?yàn)閗8s的很多官方組建服務(wù)器在國(guó)外,所以下面的很多安裝步驟痊臭,使用阿里云鏡像進(jìn)行哮肚。
3.1. 安裝與配置docker
安裝docker
# 安裝GPG證書
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 寫入軟件源信息
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 更新軟件庫(kù)
apt-get -y update
# 查詢docker版本
apt-cache madison docker-ce
# 安裝程序
# 18.04 上執(zhí)行
apt-get -y install docker-ce=5:19.03.15~3-0~ubuntu-bionic
# 20.04 上執(zhí)行
apt-get -y install docker-ce=5:19.03.15~3-0~ubuntu-focal
# 固定版本
apt-mark hold docker-ce
設(shè)置docker阿里云加速鏡像倉(cāng)庫(kù)
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://g6ogy192.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl daemon-reload
systemctl restart docker
3.2. 安裝kubeadm, kubelet, kubectl
# 下載 gpg 密鑰
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# 添加 k8s 鏡像源
cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
# 更新軟件庫(kù)
apt-get update
# 安裝程序
apt-get install -y kubelet=1.18.0-00 kubeadm=1.18.0-00 kubectl=1.18.0-00
# 固定版本
apt-mark hold kubelet kubeadm kubectl
3.3. 集群服務(wù)鏡像準(zhǔn)備
使用kubeadm config images list
命令查看當(dāng)前集群所需要的鏡像,鏡像版本會(huì)根據(jù)kubeadm版本而定广匙,返回如下內(nèi)容
k8s.gcr.io/kube-apiserver:v1.18.20
k8s.gcr.io/kube-controller-manager:v1.18.20
k8s.gcr.io/kube-scheduler:v1.18.20
k8s.gcr.io/kube-proxy:v1.18.20
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7
我們使用docker拉取鏡像允趟,但是由于國(guó)內(nèi)正常訪問不到k8s.cgr.io
,可以替換阿里加速鏡像地址:registry.aliyuncs.com/google_containers
艇潭,執(zhí)行如下命令
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.20
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.18.20
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.18.20
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.18.20
docker pull registry.aliyuncs.com/google_containers/pause:3.2
docker pull registry.aliyuncs.com/google_containers/etcd:3.4.3-0
docker pull registry.aliyuncs.com/google_containers/coredns:1.6.7
接下來(lái)給鏡像重命名拼窥,使其和原kubeadm需要的鏡像名稱一致
docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.20 k8s.gcr.io/kube-apiserver:v1.18.20
docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.18.20 k8s.gcr.io/kube-controller-manager:v1.18.20
docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.18.20 k8s.gcr.io/kube-scheduler:v1.18.20
docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.18.20 k8s.gcr.io/kube-proxy:v1.18.20
docker tag registry.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
docker tag registry.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
docker tag registry.aliyuncs.com/google_containers/coredns:1.6.7 k8s.gcr.io/coredns:1.6.7
再刪除掉從阿里云下載的鏡像
docker rmi registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.20
docker rmi registry.aliyuncs.com/google_containers/kube-controller-manager:v1.18.20
docker rmi registry.aliyuncs.com/google_containers/kube-scheduler:v1.18.20
docker rmi registry.aliyuncs.com/google_containers/kube-proxy:v1.18.20
docker rmi registry.aliyuncs.com/google_containers/pause:3.2
docker rmi registry.aliyuncs.com/google_containers/etcd:3.4.3-0
docker rmi registry.aliyuncs.com/google_containers/coredns:1.6.7
4. k8s集群的初始化
4.1. 初始化master節(jié)點(diǎn)
在master節(jié)點(diǎn)上執(zhí)行初始化命令
kubeadm init --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=Swap
參數(shù)說明
-
--service-cidr
:k8s中scv網(wǎng)絡(luò)的網(wǎng)絡(luò)段 -
--pod-network-cidr
:k8s中pod使用的網(wǎng)絡(luò)段 -
--ignore-preflight-errors
:忽略swap報(bào)錯(cuò)
初始化結(jié)果如下
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.64.8:6443 --token mzolyd.fgbta1hw9s9yml55 \
--discovery-token-ca-cert-hash sha256:21ffa3a184bb6ed36306b483723c37169753f9913e645dc4f88bb12afcebc9dd
4.2. 讓Linux用戶能操作集群
根據(jù)初始化結(jié)果提示戏蔑,為了讓master1上的Linux用戶正常操作集群蹋凝,我們輸入exit按回車切換回普通用戶后執(zhí)行以下命令
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.3. 配置集群網(wǎng)絡(luò)
根據(jù)初始化結(jié)果提示,我們需要安裝網(wǎng)絡(luò)插件总棵。本次我們使用flannel作為集群的網(wǎng)絡(luò)插件鳍寂,將flannel配置文件從互聯(lián)網(wǎng)保存到master1,文件地址為:https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml情龄,在master1上將文件命名為kube-flannel.yml迄汛,后執(zhí)行以下命令
kubectl apply -f kube-flannel.yml
如看到如下信息,即網(wǎng)絡(luò)插件安裝成功
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
4.4. 初始化集群工作節(jié)點(diǎn)
同時(shí)骤视,初始化集群管理節(jié)點(diǎn)master1之后鞍爱,我們需要將工作節(jié)點(diǎn)worker1和wroker2加入到集群中。將工作節(jié)點(diǎn)的初始化命令拷貝到worker1和worker2专酗,使集群的工作節(jié)點(diǎn)(worker1睹逃、worker2)和工作節(jié)點(diǎn)(master1)關(guān)聯(lián)起來(lái),如下命令
kubeadm join 192.168.64.8:6443 --token mzolyd.fgbta1hw9s9yml55 \
--discovery-token-ca-cert-hash sha256:21ffa3a184bb6ed36306b483723c37169753f9913e645dc4f88bb12afcebc9dd
在工作節(jié)點(diǎn)執(zhí)行初始化命令之后祷肯,我們?cè)诠芾砉?jié)點(diǎn)使用kubectl get pods --all-namespaces
查看結(jié)果沉填,如下結(jié)果
root@master1:/home/ubuntu# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-66bff467f8-pw9br 1/1 Running 0 13m
kube-system coredns-66bff467f8-wsj45 1/1 Running 0 13m
kube-system etcd-master1 1/1 Running 0 14m
kube-system kube-apiserver-master1 1/1 Running 0 14m
kube-system kube-controller-manager-master1 1/1 Running 0 14m
kube-system kube-flannel-ds-c4jnh 1/1 Running 0 3m39s
kube-system kube-flannel-ds-rg58c 1/1 Running 0 3m14s
kube-system kube-flannel-ds-sw85v 1/1 Running 0 3m15s
kube-system kube-proxy-ddk88 1/1 Running 0 3m15s
kube-system kube-proxy-dt825 1/1 Running 0 13m
kube-system kube-proxy-jgm4h 1/1 Running 0 3m14s
kube-system kube-scheduler-master1 1/1 Running 0 14m
需要注意的是,如果你的列表中顯示的所有pod并不是處于Running狀態(tài)佑笋,你需要等待一段時(shí)間翼闹。而且,你在安裝集群的過程中蒋纬,最好處于一個(gè)優(yōu)質(zhì)的網(wǎng)絡(luò)環(huán)境猎荠。
5. k8s集群的重置
# 驅(qū)離工作節(jié)點(diǎn)的 pod
kubectl drain worker1 --delete-local-data --force --ignore-daemonsets
kubectl drain worker2 --delete-local-data --force --ignore-daemonsets
# 刪除工作節(jié)點(diǎn)
kubectl delete node worker1
kubectl delete node worker2
# 重置集群
kubeadm reset