k8s集群環境搭建


環境規划

集群類型

一主多從

一台master節點和多台node節點,搭建簡單,但是有單機故障風險,適合用於測試環境

多主多從

多台master節點和多台node節點,搭建麻煩,安全性高,適合用於生產環境

 

 為了測試簡單,本次搭建的是一主兩從類型的集群

 

安裝方式

k8s有多種部署方式,目前主流的方式有kubeadm、minikube、二進制包

  • minikube:一個用於快速搭建單節點的k8s的工具
  • kubeadm:一個用於快速搭建k8s集群的工具
  • 二進制包:從官網下載的每個組件的二進制包,依次去安裝,此方式對於理解k8s組件更加有效

現在需要安裝k8s集群環境,但又不想過於麻煩,所以選擇使用kubeadm的方式

 

環境搭建

 准備三台centos虛擬機,分別命名為master node1 node2

 

 虛擬機安裝步驟自行百度,注意虛擬機配置至少2核2g內存,不然無法使用k8s集群

使用xshell連接三台虛擬機

 

配置xshell同時向三台虛擬機輸入命令

 

 改變xshell布局為瓷磚排列

 

這樣我們就能同時向三台虛擬機發送命令,同時觀察三台虛擬機的狀態了

環境初始化 

檢查centos版本

使用k8s集群要求centos版本在7.5及以上,在xshell中輸入 

[root@master ~]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)

顯示centos版本為7.9,符合要求

 主機名解析

配置三台虛擬機的主機名到ip地址的映射

[root@master ~]# vim /etc/hosts
#在里面添加
你的master虛擬機的ip地址 master
你的node1虛擬機的IP地址 node1
你的node2虛擬機的ip地址 node2

ping主機名查看是否能成功連通

[root@master ~]# ping master
[root@master ~]# ping node1
[root@master ~]# ping node2

如果都能ping通證明沒有問題

開啟時間同步

kubernetes要求集群中的節點時間必須精確一致,這里直接使用chronyd服務從網絡同步時間

啟動chronyd服務

[root@master ~]# systemctl start chronyd

設置chronyd服務開機自啟

[root@master ~]# systemctl enable chronyd

使用date驗證時間

[root@master ~]# date
2021年 06月 30日 星期三 09:51:14 CST

 

禁用iptables和firewalld服務

注意:這只是開發學習中使用,生產環境中慎重關閉

k8s和docker在運行過程中會產生大量的iptables規則,為了不讓系統規則跟它們混淆,直接關閉系統的規則

#關閉防火牆
[root@master ~]# systemctl stop firewalld
#設置開機自動關閉防火牆
[root@master ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
#關閉iptables服務
[root@master ~]# systemctl stop iptables
Failed to stop iptables.service: Unit iptables.service not loaded.

禁用selinux

selinux是linux系統下的一個安全服務,如果不關閉它,在安裝集群中會產生各種各樣的奇葩問題

[root@master ~]# vim /etc/selinux/config 
#將里面的SELINUX改為disabled
SELINUX=disabled

禁用swap分區

swap分區指的是虛擬內存分區,它的作用是在物理內存使用完之后,將磁盤空間虛擬成內存來使用

啟用swap設備會對系統的性能產生非常負面的影響,因此k8s要求每個節點都要禁用swap設備

但是如果因為某些原因確實不能關閉swap分區,就需要在集群安裝過程中通過明確的參數進行配置說明

[root@master ~]# vim /etc/fstab
#將swap一行進行注釋
#/dev/mapper/centos-swap swap 

修改linux的內核參數

修改Linux的內核參數,添加網橋過濾和地址轉發功能

[root@master ~]# vim /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

重新加載配置

[root@master ~]# sysctl -p
#加載網橋過濾模塊
[root@master ~]# modprobe br_netfilter
#查看網橋過濾模塊是否加載成功
[root@master ~]# lsmod |grep br_netfilter
br_netfilter           22256  0 
bridge                151336  1 br_netfilter

配置ipvs功能

在k8s中service有兩種代理模型,一種是基於iptables的,一種是基於ipvs的

兩者比較的話,ipvs的性能明顯要高一些,但是如果要使用它的話,需要手動載入ipvs模塊

安裝ipset和ipvsadm

[root@master ~]# yum install ipset ipvsadm -y

添加需要加載的模塊寫入腳本文件

[root@master ~]# cat <<EOF> /etc/sysconfig/modules/ipvs.modules
> #!/bin/bash
> modprobe -- ip_vs
> modprobe -- ip_vs_rr
> modprobe -- ip_vs_wrr
> modprobe -- ip_vs_sh
> modprobe -- nf_conntrack_ipv4
> EOF

為腳本文件添加權限

[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules 
#執行腳本文件
[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules

查看對應的模塊是否加載成功

[root@master ~]# lsmod |grep -e ip_vs -e nf_conntrack_ipv4
nf_conntrack_ipv4      15053  0 
nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
ip_vs_sh               12688  0 
ip_vs_wrr              12697  0 
ip_vs_rr               12600  0 
ip_vs                 145458  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack          139264  2 ip_vs,nf_conntrack_ipv4
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack

重啟服務器

上述步驟完成之后,需要重啟Linux系統

[root@master ~]# reboot

查看selinux是否是禁用狀態

[root@master ~]# getenforce
Disabled

查看swap分區

[root@master ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1819         166        1488           9         164        1504
Swap:             0           0           0

 

安裝docker

依舊發送鍵盤輸入的所有會話

 

 

切換鏡像源

[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

查看當前鏡像源中支持的docker版本

[root@master ~]# yum list docker-ce --showduplicates

安裝特定版本的docker-ce

#安裝時必須指定--setopt=obsoletes=0,否則yum會自動安裝更高版本
[root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y

添加一個配置文件

docker在默認情況下使用的Cgroup Driver為cgroupfs,而k8s推薦使用systemd來代替cgroupfs

[root@master ~]# mkdir /etc/docker
[root@master ~]# cat <<EOF> /etc/docker/daemon.json
> {
>   "exec-opts":["native.cgroupdriver=systemd"],
>   "registry-mirrors":["https://knOt2bca.mirror.aliyuncs.com"]
> }
> EOF
[root@master ~]# more /etc/docker/daemon.json 
{
  "exec-opts":["native.cgroupdriver=systemd"],
  "registry-mirrors":["https://kn0t2bca.mirror.aliyuncs.com"]
}

啟動docker

[root@master ~]# systemctl start docker
[root@master ~]# docker version
Client:
 Version:           18.06.3-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        d7080c1
 Built:             Wed Feb 20 02:26:51 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.3-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       d7080c1
  Built:            Wed Feb 20 02:28:17 2019
  OS/Arch:          linux/amd64
  Experimental:     false

設置docker開機自啟動

[root@master ~]# systemctl enable docker

 

安裝kubernetes組件

由於kubernetes的鏡像源在國外,這里切換成國內的鏡像源

[root@master ~]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

安裝kubeadm、kubelet和kubectl

[root@master ~]# yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y

配置kubelet的cgroup

[root@master ~]# vim /etc/sysconfig/kubelet 
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

設置kubernets開機自啟

[root@master ~]# systemctl enable kubelet

 

准備集群鏡像

在安裝kubernetes集群之前,必須提前准備好集群需要的鏡像,所需鏡像可以通過下面命令查看

[root@node1 ~]# kubeadm config images list
I0630 15:52:58.055686    9125 version.go:251] remote version is much newer: v1.21.2; falling back to: stable-1.17
W0630 15:53:00.822309    9125 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0630 15:53:00.822336    9125 validation.go:28] Cannot validate kubelet config - no validator is available
k8s.gcr.io/kube-apiserver:v1.17.17
k8s.gcr.io/kube-controller-manager:v1.17.17
k8s.gcr.io/kube-scheduler:v1.17.17
k8s.gcr.io/kube-proxy:v1.17.17
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5

下載鏡像

[root@master ~]# images=(
 kube-apiserver:v1.17.17
 kube-controller-manager:v1.17.17
 kube-scheduler:v1.17.17
 kube-proxy:v1.17.17
 pause:3.1
 etcd:3.4.3-0
 coredns:1.6.5
)
[root@master ~]# for imageName in ${images[@]};do
   docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
   docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
   docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done

查看鏡像

[root@master ~]# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-proxy                v1.17.17            3ef67d180564        5 months ago        117MB
k8s.gcr.io/kube-apiserver            v1.17.17            38db32e0f351        5 months ago        171MB
k8s.gcr.io/kube-controller-manager   v1.17.17            0ddd96ecb9e5        5 months ago        161MB
k8s.gcr.io/kube-scheduler            v1.17.17            d415ebbf09db        5 months ago        94.4MB
k8s.gcr.io/coredns                   1.6.5               70f311871ae1        20 months ago       41.6MB
k8s.gcr.io/etcd                      3.4.3-0             303ce5db0e90        20 months ago       288MB
k8s.gcr.io/pause                     3.1                 da86e6ba6ca1        3 years ago         742kB

 

集群初始化

注意:此過程只需要在master節點上執行

創建集群

[root@master ~]# kubeadm init \
--kubernetes-version=v1.17.17 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=你的master的ip地址

如果成功,你將會在最后兩行看見如下消息

 

 復制這兩行消息

將節點加入k8s集群

在節點一及節點二中粘貼剛剛復制的消息

 

 

在master節點中添加配置

[root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[root@master ~]# kubectl get nodes

查看kubernetes節點信息

[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES    AGE    VERSION
master   NotReady   master   149m   v1.17.4
node1    NotReady   <none>   137m   v1.17.4
node2    NotReady   <none>   137m   v1.17.4

表明節點添加成功

 

安裝網絡插件

注意:此操作只在master節點執行

 獲取fannel的配置文件

[root@master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

如果下載失敗可以復制鏈接到你的電腦然后通過代理進行下載傳到虛擬機中

運行安裝命令

[root@master ~]# kubectl apply -f kube-flannel.yml 
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

查看狀態

[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE     VERSION
master   Ready    master   3h34m   v1.17.4
node1    Ready    <none>   3h23m   v1.17.4
node2    Ready    <none>   3h23m   v1.17.4

 

服務部署

在k8s集群中部署一個nginx程序,測試集群是否在正常工作

部署nginx

注意:此操作只在master節點上執行

 

[root@master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine
deployment.apps/nginx created

 

暴露端口

[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed

查看服務狀態

[root@master ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6867cdf567-65vjr   1/1     Running   0          33m
[root@master ~]# kubectl get service
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP        17h
nginx        NodePort    10.99.24.85   <none>        80:31892/TCP   33m

在瀏覽器中輸入主機ip地址加上nginx的端口,我這里是31892

 

 

表明nginx已經正常開啟了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM