轉載自https://blog.csdn.net/weixin_43551152/article/details/87970671
Kubernetes技術已經成為了原生雲技術的事實標准,它是目前基礎軟件領域最為熱門的分布式調度和管理平台。於是,Kubernetes也幾乎成了時下開發工程師和運維工程師必備的技能之一。
一、主機環境預設
1、測試環境說明
測試使用的Kubernetes集群可由一個master主機及一個以上(建議至少兩個)node主機組成,這些主機可以是物理服務器,也可以運行於vmware、virtualbox或kvm等虛擬化平台上的虛擬機,甚至是公有雲上的VPS主機。
本測試環境將由master01、node01和node02三個獨立的主機組成,它們分別擁有4核心的CPU及4G的內存資源,操作系統環境均為CentOS 7.5 1804,域名為ilinux.io。此外,各主機需要預設的系統環境如下:
(1)借助於NTP服務設定各節點時間精確同步;
(2)通過DNS完成各節點的主機名稱解析,測試環境主機數量較少時也可以使用hosts文件進行;
(3)關閉各節點的iptables或firewalld服務,並確保它們被禁止隨系統引導過程啟動;
(4)各節點禁用SELinux;
(5)各節點禁用所有的Swap設備;
(6)若要使用ipvs模型的proxy,各節點還需要載入ipvs相關的各模塊;
2、設定時鍾同步
若節點可直接訪問互聯網,直接啟動chronyd系統服務,並設定其隨系統引導而啟動。
~]# systemctl start chronyd.service
~]# systemctl enable chronyd.service
不過,建議用戶配置使用本地的的時間服務器,在節點數量眾多時尤其如此。存在可用的本地時間服務器時,修改節點的/etc/crhony.conf配置文件,並將時間服務器指向相應的主機即可,配置格式如下:
server CHRONY-SERVER-NAME-OR-IP iburst
3、主機名稱解析
出於簡化配置步驟的目的,本測試環境使用hosts文件進行各節點名稱解析,文件內容如下所示:
172.20.101.41 master01.ilinux.io master01
172.20.102.64 node01.ilinux.io node01
172.20.102.78 node02.ilinux.io node02
172.20.102.89 node03.ilinux.io node03
172.20.102.81 node04.ilinux.io node04
172.20.102.66 node05.ilinux.io node05
172.20.102.65 node06.ilinux.io node06
172.20.102.79 node07.ilinux.io node07
192.168.245.17 master.ilinux.io master
192.168.245.27 node01.ilinux.io node01
192.168.245.37 node02.ilinux.io node02
192.168.245.47 node03.ilinux.io node03
172.20.101.41 master.ilinux.io master
172.20.102.64 node01.ilinux.io node01
172.20.102.65 node02.ilinux.io node02
172.20.102.66 node03.ilinux.io node03
4、關閉iptables或firewalld服務
在CentOS7上,iptables或firewalld服務通常只會安裝並啟動一種,在不確認具體啟動狀態的前提下,這里通過同時關閉並禁用二者即可簡單達到設定目標。
~]# systemctl stop firewalld.service
~]# systemctl stop iptables.service
~]# systemctl disable firewalld.service
~]# systemctl disable iptables.service
5、關閉並禁用SELinux
若當前啟用了SELinux,則需要編輯/etc/sysconfig/selinux文件,禁用SELinux,並臨時設置其當前狀態為permissive:
~]# sed -i 's@^SELINUX=SELINUX=.*@\1disabled@' /etc/sysconfig/selinux
~]# setenforce 0
6、禁用Swap設備
部署集群時,kubeadm默認會預先檢查當前主機是否禁用了Swap設備,並在未禁用時強制終止部署過程。因此,在主機內存資源充裕的條件下,需要禁用所有的Swap設備,否則,就需要在后文的kubeadm init及kubeadm join命令執行時額外使用相關的選項忽略檢查錯誤。
關閉Swap設備,需要分兩步完成。首先是關閉當前已啟用的所有Swap設備:
~]# swapoff -a
而后編輯/etc/fstab配置文件,注釋用於掛載Swap設備的所有行。
7、啟用ipvs內核模塊
創建內核模塊載入相關的腳本文件/etc/sysconfig/modules/ipvs.modules,設定自動載入的內核模塊。文件內容如下:
#!/bin/bash
ipvs_mods_dir="/usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs"
for mod in $(ls $ipvs_mods_dir | grep -o "^[^.]*"); do
/sbin/modinfo -F filename $mod &> /dev/null
if [ $? -eq 0 ]; then
/sbin/modprobe $mod
fi
done
修改文件權限,並手動為當前系統加載內核模塊:
~]# chmod +x /etc/sysconfig/modules/ipvs.modules
~]# bash /etc/sysconfig/modules/ipvs.modules
二、安裝程序包(在各主機上完成如下設定)
1、生成yum倉庫配置
首先獲取docker-ce的配置倉庫配置文件:
~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker.repo
而后手動生成kubernetes的yum倉庫配置文件/etc/yum.repos.d/kubernetes.repo,內容如下:
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
enabled=1
2、安裝相關的程序包
Kubernetes會對經過充分驗正的Docker程序版本進行認證,目前認證完成的最高版本是17.03,但docker-ce的最新版本已經高出了幾個版本號。管理員可忽略此認證而直接使用最新版本的docker-ce程序,不過,建議根據后面的說明,將安裝命令替換為安裝17.03版。
~]# yum install -y docker-ce
~]# yum install -y kubelet kubeadm kubectl
如果要安裝目前經過Kubernetes認證的docker-17版本,可以將上面第一條安裝命令替換為如下命令:
~]# yum install -y --setopt=obsoletes=0 docker-ce-17.03.2.ce docker-ce-selinux-17.03.2.ce
三、啟動docker服務(在各節點執行)
若要通過默認的k8s.gcr.io鏡像倉庫獲取Kubernetes系統組件的相關鏡像,需要配置docker Unit File(/usr/lib/systemd/system/docker.service文件)中的Environment變量,為其定義合用的HTTPS_PROXY,格式如下:
Environment="HTTPS_PROXY=http://ik8s.io:10070"
Environment="NO_PROXY=192.168.100.0/24,127.0.0.0/8"
另外,docker自1.13版起會自動設置iptables的FORWARD默認策略為DROP,這可能會影響Kubernetes集群依賴的報文轉發功能,因此,需要在docker服務啟動后,重新將FORWARD鏈的默認策略設備為ACCEPT,方式是修改/usr/lib/systemd/system/docker.service文件,在“ExecStart=/usr/bin/dockerd”一行之后新增一行如下內容:
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
重載完成后即可啟動docker服務:
~]# systemctl daemon-reload
~]# systemctl start docker.service
而后設定docker和kubelet隨系統引導自動啟動:
~]# systemctl enable docker kubelet
四、初始化主節點(在master01上完成如下操作)
1、初始化master節點
若未禁用Swap設備,則需要編輯kubelet的配置文件/etc/sysconfig/kubelet,設置其忽略Swap啟用的狀態錯誤,內容如下:
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
(可選步驟)而后,在運行初始化命令之前先運行如下命令單獨獲取相關的鏡像文件,而后再運行后面的kubeadm init命令,以便於觀察到鏡像文件的下載過程。
~]# kubeadm config images pull
而后即可進行master節點初始化。kubeadm init命令支持兩種初始化方式,一是通過命令行選項傳遞關鍵的部署設定,另一個是基於yaml格式的專用配置文件,后一種允許用戶自定義各個部署參數。下面分別給出了兩種實現方式的配置步驟,建議讀者采用第二種方式進行。
初始化方式一:
運行如下命令完成master01節點的初始化:
~]# kubeadm init --kubernetes-version=v1.13.3 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
命令中的各選項簡單說明如下:
(1) --kubernetes-version選項的版本號用於指定要部署的Kubenretes程序版本,它需要與當前的kubeadm支持的版本保持一致;
(2) --pod-network-cidr選項用於指定分Pod分配使用的網絡地址,它通常應該與要部署使用的網絡插件(例如flannel、calico等)的默認設定保持一致,10.244.0.0/16是flannel默認使用的網絡;
(3) --service-cidr用於指定為Service分配使用的網絡地址,它由kubernetes管理,默認即為10.96.0.0/12;
(4) 最后一個選項“--ignore-preflight-errors=Swap”僅應該在未禁用Swap設備的狀態下使用。
初始化方式二:
kubeadm也可通過配置文件加載配置,以定制更豐富的部署選項。以下是個符合前述命令設定方式的使用示例,不過,它明確定義了kubeProxy的模式為ipvs,並支持通過修改imageRepository的值修改獲取系統鏡像時使用的鏡像倉庫。
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.13.3
api:
advertiseAddress: 172.20.0.71
bindPort: 6443
controlPlaneEndpoint: ""
imageRepository: k8s.gcr.io
kubeProxy:
config:
mode: "ipvs"
ipvs:
ExcludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
syncPeriod: 30s
kubeletConfiguration:
baseConfig:
cgroupDriver: cgroupfs
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
failSwapOn: false
resolvConf: /etc/resolv.conf
staticPodPath: /etc/kubernetes/manifests
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
將上面的內容保存於配置文件中,例如kubeadm-config.yaml,而后執行相應的命令:
~]# kubeadm init --config kubeadm-config.yaml --ignore-preflight-errors=Swap
注意:對於Kubernetes系統的新用戶來說,無論使用上述哪種方法,命令運行結束后,請記錄最后的kubeadm join命令輸出的最后提示的操作步驟。下面的內容是需要用戶記錄的一個命令輸出示例,它提示了后續需要的操作步驟:
Your Kubernetes master 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/
You can now join any number of machines by running the following on each node
as root:
kubeadm join 172.20.0.71:6443 --token gwxgdg.igg5728t1vt8ahhx --discovery-token-ca-cert-hash sha256:9b63cd1530b50da4733d2e7dace9270782211e25ec2e4bbac395e59adc56a26c
另外,kubeadm init命令完整參考指南請移步官方文檔。https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/。
2、初始化kubectl
kubectl是kube-apiserver的命令行客戶端程序,實現了除系統部署之外的幾乎全部的管理操作,是kubernetes管理員使用最多的命令之一。kubectl需經由API server認證及授權后方能執行相應的管理操作,kubeadm部署的集群為其生成了一個具有管理員權限的認證配置文件/etc/kubernetes/admin.conf,它可由kubectl通過默認的“$HOME/.kube/config”的路徑進行加載。當然,用戶也可在kubectl命令上使用--kubeconfig選項指定一個別的位置。
下面復制認證為Kubernetes系統管理員的配置文件至目標用戶(例如當前用戶root)的家目錄下:
~]# mkdir ~/.kube
~]# cp /etc/kubernetes/admin.conf ~/.kube/config
而后,即可通過kubectl進行客戶端命令測試,並借此了解集群組件的當前狀態:
~]# kubectl get componentstatus
一個正常的輸出應該類似如下輸出結果所示:
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health": "true"}
3、添加flannel網絡附件
Kubernetes系統上Pod網絡的實現依賴於第三方插件進行,這類插件有近數十種之多,較為著名的有flannel、calico、canal和kube-router等,簡單易用的實現是為CoreOS提供的flannel項目。下面的命令用於在線部署flannel至Kubernetes系統之上:
~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
而后使用如下命令確認其輸出結果中Pod的狀態為“Running”,類似如下所示:
~]# kubectl get pods -n kube-system -l app=flannel
NAME READY STATUS RESTARTS AGE
kube-flannel-ds-amd64-wscnz 1/1 Running 0 14m
4、驗正master節點已經就緒
~]# kubectl get nodes
上述命令應該會得到類似如下輸出:
NAME STATUS ROLES AGE VERSION
master01.ilinux.io Ready master 4m9s v1.13.3
五、添加節點到集群中(在node01和node02上分別完成如下操作)
1、若未禁用Swap設備,編輯kubelet的配置文件/etc/sysconfig/kubelet,設置其忽略Swap啟用的狀態錯誤,內容如下:
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
2、將節點加入第二步中創建的master的集群中,要使用主節點初始化過程中記錄的kubeadm join命令,並且在未禁用Swap設備的情況下,額外附加“--ignore-preflight-errors=Swap”選項;
~]# kubeadm join 172.20.0.71:6443 --token gwxgdg.igg5728t1vt8ahhx --discovery-token-ca-cert-hash sha256:9b63cd1530b50da4733d2e7dace9270782211e25ec2e4bbac395e59adc56a26c --ignore-preflight-errors=Swap
在每個節點添加完成后,即可通過kubectl驗正添加結果。下面的命令及其輸出是在node01和node02均添加完成后運行的,其輸出結果表明兩個Node已經准備就緒。
~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01.magedu.com Ready master 31m v1.13.3
node01.magedu.com Ready <none> 3m8s v1.13.3
node02.magedu.com Ready <none> 2m25s v1.13.3
到此為止,一個master,並附帶有兩個node的kubernetes集群基礎設施已經部署完成,用戶隨后即可測試其核心功能。例如,下面的命令可將myapp以Pod的形式編排運行於集群之上,並通過在集群外部進行訪問:
~]# kubectl create deployment myapp --image=ikubernetes/myapp:v1
~]# kubectl create service nodeport myapp --tcp=80:80
而后,使用如下命令了解Service對象myapp使用的NodePort,以便於在集群外部進行訪問:
~]# kubectl get svc -l app=myapp
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myapp NodePort 10.102.254.75 <none> 80:31257/TCP 2m32s
myapp是一個web應用,因此,用戶可以於集群外部通過“http://NodeIP:31257”這個URL訪問myapp上的應用,例如於集群外通過瀏覽器訪問“http://172.20.0.61:31257”。
master history
31 2019-02-17 14:39:14 root yum repolist
32 2019-02-17 14:46:15 root vim /etc/hostname
33 2019-02-17 14:47:35 root vim /etc/hosts
34 2019-02-17 14:49:33 root reboot
35 2019-02-17 14:49:33 root ping node01
36 2019-02-17 14:50:32 root yum repolist
37 2019-02-17 14:51:13 root wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker.repo
38 2019-02-17 14:51:45 root free -m
39 2019-02-17 14:51:57 root df -h
40 2019-02-17 14:52:03 root fdisk
41 2019-02-17 14:52:21 root date
42 2019-02-17 14:52:45 root systemctl stop firewalld.service
43 2019-02-17 14:52:56 root systemctl stop iptables.service
44 2019-02-17 14:53:15 root cat /etc/sysconfig/selinux
45 2019-02-17 14:53:36 root swapoff -a
46 2019-02-17 14:54:02 root vim /etc/sysconfig/modules/ipvs.modules
47 2019-02-17 14:54:48 root scp /etc/sysconfig/modules/ipvs.modules node01:/etc/sysconfig/modules/ipvs.modules
48 2019-02-17 14:54:57 root scp /etc/sysconfig/modules/ipvs.modules node02:/etc/sysconfig/modules/ipvs.modules
49 2019-02-17 14:55:08 root scp /etc/sysconfig/modules/ipvs.modules node03:/etc/sysconfig/modules/ipvs.modules
50 2019-02-17 14:55:28 root chmod +x /etc/sysconfig/modules/ipvs.modules
51 2019-02-17 14:55:47 root bash /etc/sysconfig/modules/ipvs.modules
52 2019-02-17 14:56:12 root ls /etc/yum.repos.d/
53 2019-02-17 14:56:25 root history
54 2019-02-17 14:56:58 root yum install -y docker-ce
55 2019-02-17 14:58:18 root yum install -y kubelet kubeadm kubectl
56 2019-02-17 15:00:14 root rpm -q docker
57 2019-02-17 15:00:24 root history
58 2019-02-17 15:00:29 root rpm -q docker-ce
59 2019-02-17 15:00:33 root rpm -ql docker-ce
60 2019-02-17 15:01:02 root vim /usr/lib/systemd/system/docker.service
61 2019-02-17 15:03:31 root scp /usr/lib/systemd/system/docker.service node01:/usr/lib/systemd/system/docker.service
62 2019-02-17 15:04:16 root scp /usr/lib/systemd/system/docker.service node02:/usr/lib/systemd/system/docker.service
63 2019-02-17 15:04:25 root scp /usr/lib/systemd/system/docker.service node03:/usr/lib/systemd/system/docker.service
64 2019-02-17 15:04:50 root systemctl daemon-reload
65 2019-02-17 15:05:09 root systemctl start docker.service
66 2019-02-17 15:05:25 root systemctl enable docker kubelet
67 2019-02-17 15:07:04 root cat "--fail-swap-on=false"
68 2019-02-17 15:07:20 root cat /etc/sysconfig/kubelet
69 2019-02-17 15:08:17 root kubeadm init --kubernetes-version=v1.13.3 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap --dry-run
70 2019-02-17 15:10:19 root kubeadm config images list
71 2019-02-17 15:11:01 root kubeadm config images pull
72 2019-02-17 15:11:51 root docker image list
73 2019-02-17 15:20:49 root lftp 172.18.0.1/pub
74 2019-02-17 15:21:01 root yum install lftp
75 2019-02-17 15:21:10 root lftp 172.18.0.1/pub
76 2019-02-17 15:24:53 root ls
77 2019-02-17 15:25:35 root docker load -i k8s-master-v1.13.3.tar
78 2019-02-17 15:26:27 root docker image list
79 2019-02-17 15:27:24 root history
80 2019-02-17 15:27:37 root kubeadm init --kubernetes-version=v1.13.3 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
81 2019-02-17 15:28:41 root history
82 2019-02-17 15:29:36 root mkdir .kube
83 2019-02-17 15:29:58 root cp /etc/kubernetes/admin.conf .kube/config
84 2019-02-17 15:32:19 root kubectl get nodes
85 2019-02-17 15:34:26 root kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
86 2019-02-17 15:34:31 root kubectl get nodes
87 2019-02-17 15:57:24 root kubectl get pods -n kube-system
88 2019-02-17 16:23:04 root vim kubenetes-init.txt
89 2019-02-17 16:24:43 root kubectl get nodes
90 2019-02-17 16:28:42 root kubectl config view
91 2019-02-17 16:29:37 root cd /etc/kubernetes/
92 2019-02-17 16:29:39 root ls
93 2019-02-17 16:30:12 root scp admin.conf node01:/root/.kube/config
94 2019-02-17 16:30:20 root scp admin.conf node02:/root/.kube/config
95 2019-02-17 16:30:53 root scp admin.conf node03:/root/.kube/config
96 2019-02-17 16:32:33 root ss -nlt
97 2019-02-17 16:33:41 root cd
98 2019-02-17 16:33:43 root history
————————————————
版權聲明:本文為CSDN博主「ZZULI_Lucas」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_43551152/article/details/87970671