kubernetes叢集安裝

呂林光發表於2022-05-14

一、基礎簡介

1、kubeadm是官方社群推出的一個用於快速部署 kubernetes 叢集的工具,這個工具能通過兩條指令完成一個kubernetes叢集的部署

2、環境要求

  • 一臺或多臺機器,作業系統CentOS 7.x-86_x64

  • 硬體配置:記憶體2GB或2G+,CPU 2核或CPU 2核+

  • 叢集內各個機器之間能相互通訊

  • 叢集內各個機器可以訪問外網,需要拉取映象

  • 禁止swap分割槽

3、節點規劃如下

主機名 ip地址 部署元件
k8s-master01 192.168.3.17 kube-apiserver、kube-scheduler、kube-controller-manager、etcd、kubelet、kubeadm、kubectl
k8s-node01 192.168.3.18 kubelet、kubeadm、kubectl
k8s-node02 192.168.3.19 kubelet、kubeadm、kubectl

4、元件介紹

  • kube-apiserver:所有服務訪問統一入口
  • kube-controller-manager:維持副本期望數目
  • kube-scheduler:負責介紹任務,選擇合適的節點進行分配任務
  • etcd:鍵值對資料庫 儲存K8S叢集所有重要資訊(持久化)
  • kubelet:直接跟容器引擎互動實現容器的生命週期管理
  • kube-proxy:負責寫入規則至 iptables、ipvs 實現服務對映訪問的
  • coredns:可以為叢集中的SVC建立一個域名IP的對應關係解析
  • ingress-controller:官方只能實現四層代理,ingress 可以實現七層代理

5、架構圖

二、系統初始化

1、設定主機名

# 在master節點執行
hostnamectl set-hostname k8s-master01

# 在work01節點執行
hostnamectl set-hostname k8s-node01

# 在work02節點執行
hostnamectl set-hostname k8s-node02

2、配置主機和IP對映

cat >> /etc/hosts << EOF
192.168.3.17 k8s-master01
192.168.3.18 k8s-node01
192.168.3.19 k8s-node02
EOF

3、安裝依賴包

yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git

4、設定防火牆為iptables並設定空規則

# 關閉防火牆
systemctl stop firewalld && systemctl disable firewalld

# 清理防火牆規則,設定預設轉發策略
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT

# 需要開啟防火牆的可以走這一步
# systemctl stop firewalld && systemctl disable firewalld
# yum install -y iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save

5、關閉 selinux 和 swap交換分割槽

  • 開啟 /etc/fstab 註釋掉 swap行,臨時關閉:swapoff -a
  • 開啟 /etc/sysconfig/selinux,將SELINUX=enforcing修改為SELINUX=disabled,臨時關閉:setenforce 0
# 禁用swap分割槽
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 禁用 selinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

6、配置核心引數,將橋接的IPv4流量傳遞到iptables的鏈

# 載入模組
modprobe br_netfilter

cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF

# 重新載入配置
sysctl -p /etc/sysctl.d/kubernetes.conf

7、時間同步

yum install ntpdate -y
ntpdate time.windows.com

8、關閉不需要的服務

systemctl stop postfix && systemctl disable postfix

9、升級linux核心

  • CentOS 7.x 系統自帶的 3.10.x 核心存在一些 Bugs,導致執行的 Docker、Kubernetes 不穩定
# 檢視核心版本
cat /proc/version

# 升級版本
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install -y kernel-lt

#設定開機從新核心啟動(設定如下圖版本號)
grub2-set-default 'CentOS Linux (5.4.193-1.el7.elrepo.x86_64) 7 (Core)'

#重啟電腦
shutdown -r now
  • 升級成功如下圖

三、Kubeadm安裝

1、k8s配置使用ipvs為代理,kube-proxy開啟ipvs的前置條件

# 載入模組
modprobe br_netfilter

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
modprobe -- br_netfilter
EOF

# 修改訪問許可權
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules

2、配置國內yum源

curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 或以下方式
# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# rm -rf /var/cache/yum && yum makecache && yum -y update && yum -y autoremove

3、安裝Docker

# 安裝必要的一些系統工具
yum install -y yum-utils device-mapper-persistent-data lvm2

# 新增軟體源資訊
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 更新並安裝Docker-ce
yum update -y && yum install -y docker-ce

# 建立docker目錄
mkdir /etc/docker

# 配置daemon(新增阿里雲 YUM 軟體源)
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "insecure-registries":["192.168.3.12:6007"]
}
EOF

# 重啟docker 服務
systemctl daemon-reload && systemctl restart docker && systemctl enable docker

#檢視docker版本
docker --version

4、配置k8s的阿里雲yum源

cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

5、安裝 kubeadm、kubelet 和 kubectl , 每個節點都需要安裝

  • Kubelet:執行在cluster所有節點上,負責啟動pod和容器
  • Kubeadm:用於初始化cluster的一個工具
  • Kubectl:命令列工具,通過kubectl可以部署和管理應用,檢視各種資源,建立,刪除和更新元件
# 安裝指定版本
yum install -y kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1 --disableexcludes=kubernetes

# 安裝最新版本
# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

# 啟動 kubelet 服務
systemctl start kubelet && systemctl enable kubelet

# 檢視已經安裝的版本
kubelet --version

6、初始化主節點(只在master節點上執行)

  • kubernetes-version:K8s版本,與上面安裝的一致
  • apiserver-advertise-address:master主機內網IP地址
  • image-repository:指定阿里雲映象倉庫地址。由於kubeadm 預設從官網http://k8s.grc.io下載所需映象,國內無法訪問,因此需要指定阿里雲映象倉庫地址
  • service-cidr:叢集內部虛擬網路,Pod統一訪問入口
  • pod-network-cidr: 定義pod網段為:10.244.0.0/16
kubeadm init \
--kubernetes-version=1.23.1 \
--apiserver-advertise-address=192.168.3.17 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
  • 如果安裝報錯,可以通過以下命令檢視日誌
journalctl -xeu kubelet 
或者 
journalctl -xeu kubelet -l
  • 安裝完成,如下圖

7、配置Kubectl工具

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

8、檢視叢集狀態

  • 通過以下命令檢視叢集資訊,發現已經有master01節點了,但是狀態為:NotReady,原因為未安裝flannel外掛,如下圖
# 檢視節點狀態
kubectl get node

# 檢視system下的pods
kubectl get pods -n kube-system


9、部署 Flannel網路

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 如果這個檔案無法訪問,可以直接下載下來,然後在本地執行

# github下載地址
# https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml

# 執行資原始檔
# kubectl apply -f kube-flannel.yml
  • 執行後,需要等待一會,直到flannel和coredns執行即可,如下圖
# 檢視pod實時更新狀態
kubectl get pod -n kube-system -w



四、node節點加入叢集

1、master節點建立token

kubeadm token create --print-join-command

# 查詢token列表
# kubeadm token list

# token永不失效
# kubeadm token create --ttl 0

如圖:

2、node節點執行kubeadm join命令加入叢集,如下圖

kubeadm join 192.168.3.17:6443 --token 2yedu7.ouajpjva3kb8pib0 \
        --discovery-token-ca-cert-hash sha256:8d799bd680ea04626d3146d5cd37aee2b8623bc4ec92050a6d620f93e4e38fe7

3、在master節點上檢視node狀態,發現已經有node01節點了,狀態為NotReady,需要等待flannel初始化完成即可,如下圖

五、參考

相關文章