本系列文章先较,我們將在Ubuntu Server 18.04上搭建k8s環(huán)境進行入門學(xué)習(xí)携冤。為了使用原生的Ubuntu Server 18.04,我們將使用multipass來創(chuàng)建多臺Ubuntu Server 18.04虛擬環(huán)境闲勺。也就是說曾棕,如果你想完整參考本系列博客學(xué)習(xí),你電腦上應(yīng)當(dāng)安裝并能正常運行multipass菜循,如果你想了解multipass基本操作翘地,可以參考我寫的另一篇博客:https://blog.jkdev.cn/index.php/archives/327/。
本文演示k8s集群搭建步驟癌幕,并不涉及k8s基礎(chǔ)知識子眶,你可能對文章的一些專業(yè)詞語感到默認(rèn),但沒有關(guān)系序芦,我們在后面會循序漸進地介紹k8s知識臭杰。
本次我們將部署一個主節(jié)點(master1)和兩個工作節(jié)點(worker1、worker2)的集群谚中。為了節(jié)省電腦資源渴杆,master1、worker1宪塔、worker2每個節(jié)點分配2個cpu磁奖、2G內(nèi)存、10G硬盤某筐。這是k8s要求的最低配置比搭,但這些配置完全足夠我們用以學(xué)習(xí)。相關(guān)操作都會在root用戶之下南誊。
一身诺、準(zhǔn)備環(huán)境
1. 創(chuàng)建Ubuntu Server 18.04虛擬機
分別創(chuàng)建2核cpu、10G硬盤抄囚、2G內(nèi)存霉赡,名為master1、worker1幔托、worker2三臺虛擬機
multipass launch -c 1 -d 10G -m 1G -n master1 18.04
multipass launch -c 1 -d 10G -m 1G -n worker1 18.04
multipass launch -c 1 -d 10G -m 1G -n worker2 18.04
使用multipass list
查詢創(chuàng)建的虛擬機列表穴亏,如下
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
創(chuàng)建虛擬機之后,我們需要對虛擬機進行初始化操作重挑,以下的操作需要在所有主機上進行嗓化。
2. 修改root用戶密碼
為了方便使用root用戶,我們對每一臺虛擬機進行密碼修改操作谬哀。以master1為例刺覆,如下代碼
# 進入主機
multipass shell master1
# 修改root密碼,這里我都改為123456
sudo passwd root
# 修改密碼之后玻粪,直接使用su命令切換 root用戶
su
3. 關(guān)閉防火墻和iptables
根據(jù)官方文檔隅津,防火墻和iptables可能會影響到k8s集群诬垂,所以我們需要關(guān)閉掉
# 關(guān)閉防火墻
ufw disable
# 關(guān)閉iptables
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
二、安裝docker與kubeadm
下面的很多安裝過程伦仍,我們大多使用阿里云鏡像進行安裝结窘。
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"
# 更新軟件庫
apt-get -y update
# 安裝程序
apt-get -y install docker-ce=5:19.03.15~3-0~ubuntu-bionic
# 固定版本
apt-mark hold docker-ce
設(shè)置docker阿里云加速鏡像倉庫
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
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
# 更新軟件庫
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. 集群鏡像準(zhǔn)備
使用kubeadm config images list
命令查看當(dāng)前集群所需要的鏡像,鏡像版本會根據(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拉取鏡像隧枫,但是由于國內(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
接下來給鏡像重命名官脓,使其和原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
三、k8s集群初始化
1. 初始化master節(jié)點
在master節(jié)點上執(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報錯
初始化結(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
2. 配置集群網(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
3. 讓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. 初始化集群工作節(jié)點
同時沮翔,初始化集群管理節(jié)點master1之后陨帆,我們需要將工作節(jié)點worker1和wroker2加入到集群中。將工作節(jié)點的初始化命令拷貝到worker1和worker2采蚀,使集群的工作節(jié)點(worker1疲牵、worker2)和工作節(jié)點(master1)關(guān)聯(lián)起來,如下命令
kubeadm join 192.168.64.8:6443 --token mzolyd.fgbta1hw9s9yml55 \
--discovery-token-ca-cert-hash sha256:21ffa3a184bb6ed36306b483723c37169753f9913e645dc4f88bb12afcebc9dd
在工作節(jié)點執(zhí)行初始化命令之后搏存,我們在管理節(jié)點使用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)璧眠,你需要等待一段時間。而且读虏,你在安裝集群的過程中责静,最好處于一個優(yōu)質(zhì)的網(wǎng)絡(luò)環(huán)境。
至此盖桥,集群搭建完畢灾螃。從下一篇文章開始我們將繼續(xù)介紹k8s基礎(chǔ)知識
本文原創(chuàng)首發(fā)自wx訂閱號:極客開發(fā)者up,禁止轉(zhuǎn)載