一、基礎簡介
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
- 一般在國內無法訪問k8s.gcr.io,所以需要配置國內映象託管站點
- insecure-registries:配置為harbor地址,學習地址:https://www.cnblogs.com/lvlinguang/p/15500171.html
# 安裝必要的一些系統工具
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初始化完成即可,如下圖