1. 程式人生 > 實用技巧 >centos7.8 安裝部署 k8s 叢集

centos7.8 安裝部署 k8s 叢集

centos7.8 安裝部署 k8s 叢集

目錄

剛接觸 k8s,配置環境折騰了一天,感覺有很多坑,網上很多教程已經不靠譜了,自己記錄下安裝部署 k8s 的全過程。

環境說明

software version
OS CentOS Linux release 7.8.2003 (Core)
Docker 18.09.6
kubelet v1.14.2
kubeadm v1.14.2
kubectl v1.14.2
flannel v0.9.1

Docker 安裝

  1. 安裝依賴
yum install -y yum-utils   device-mapper-persistent-data   lvm2
  1. 設定 Docker 源
yum-config-manager     --add-repo     https://download.docker.com/linux/centos/docker-ce.repo
  1. 安裝 Docker CE

docker 安裝版本檢視

yum list docker-ce --showduplicates | sort -r

安裝 Docker,指定版本

yum install docker-ce-18.09.6 docker-ce-cli-18.09.6 containerd.io
  1. 啟動 Docker
systemctl start docker	# 啟動 docker服務

systemctl enable docker # 設定開機啟動 docker
  1. 命令補全

安裝 bash-completion

yum -y install bash-completion

source /etc/profile.d/bash_completion.sh
  1. 映象加速

可以在 https://cr.console.aliyun.com

中獲取自己的加速域名

配置 daemon.json 檔案

mkdir -p /etc/docker

cd /etc/docker && vim daemon.json

# 修改檔案
{
  "registry-mirrors": [
  	"https://xxxxxx.mirror.aliyuncs.com"
  ]
}
  1. 重啟服務
systemctl daemon-reload

system restart docker
  1. 驗證
docker --version

docker run hello-world

k8s 安裝準備工作

注意 centos 禁用防火牆和 selinux,並且設定 阿里源

  1. 修改主機名
hostnamectl set-hostname master

cat /etc/hostname	# 檢視
  1. 修改 hosts (多節點配置)
cat >> /etc/hosts << EOF
xxx.xxx.xxx.xxx    master
xxx.xxx.xxx.xxx    node01
xxx.xxx.xxx.xxx    node02
EOF
  1. 禁用 swap
# 臨時禁用
swapoff -a

# 永久禁用
sed -i.bak '/swap/s/^/#/' /etc/fstab
  1. 核心引數修改(重要,不然出現 bug 找半天原因…… )
# 臨時修改
sysctl net.bridge.bridge-nf-call-iptables=1
sysctl net.bridge.bridge-nf-call-ip6tables=1

# 永久修改
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl -p /etc/sysctl.d/k8s.conf
  1. 修改 Cgroup Driver

修改 /etc/docker/daemon.json

{
  "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}

重新載入 docker

systemctl daemon-reload

systemctl restart docker
  1. 設定 kubernetes 源

新增 k8s 源

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

更新快取

yum clean all

yum -y makecache

Master 節點安裝 k8s

版本檢視

yum list kubelet --showduplicates | sort -r 

安裝 kubelet,kubeadm,kubectl

  1. 指定版本安裝
yum install -y kubelet-1.14.2

yum install -y kubeadm-1.14.2

yum install -y kubectl-1.14.2
  • kubelet 執行在叢集所有節點上,用於啟動Pod和容器等物件的工具
  • kubeadm 用於初始化叢集,啟動叢集的命令工具
  • kubectl 用於和叢集通訊的命令列,通過kubectl可以部署和管理應用,檢視各種資源,建立、刪除和更新各種元件
  1. 啟動 kubelet 並設定開機啟動
systemctl enable kubelet && systemctl start kubelet
  1. Kubelet 命令補全

https://kubernetes.io/zh/docs/tasks/tools/install-kubectl/

(我使用的 zsh,bash 和 zsh 有所不同)

Bash:

echo "source <(kubectl completion bash)" >> ~/.bash_profile
source .bash_profile 

Zsh:

if [ $commands[kubectl] ]; then
  source <(kubectl completion zsh)
fi

如果是 On-My-Zsh,需要在 plugin 中加入

plugins=(kubectl)

下載映象

Kubernetes幾乎所有的安裝元件和Docker映象都放在goolge自己的網站上,直接訪問可能會有網路問題,這裡的解決辦法是從阿里雲映象倉庫下載映象,拉取到本地以後改回預設的映象tag。

  1. 新建 image.sh 指令碼。
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/google_containers
version=v1.14.2
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
  docker pull $url/$imagename
  docker tag $url/$imagename k8s.gcr.io/$imagename
  docker rmi -f $url/$imagename
done
  1. 下載映象
chmod u+x image.sh

./image.sh

docker images

初始化 Master

  1. 初始化
kubeadm init
  1. 載入環境變數
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

source .bash_profile 

如果不是在 root 使用者下執行,需要執行以下操作:

mkdir -p $HOME/.kube

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

chown $(id -u):$(id -g) $HOME/.kube/config
  1. 安裝 pod 網路

拉取映象

docker pull quay.io/coreos/flannel:v0.9.1-amd64
mkdir -p /etc/cni/net.d/

cat <<EOF> /etc/cni/net.d/10-flannel.conf
{"name":"cbr0","type":"flannel","delegate": {"isDefaultGateway": true}}
EOF

設定環境變數

mkdir /usr/share/oci-umount/oci-umount.d -p
mkdir /run/flannel/
cat <<EOF> /run/flannel/subnet.env
FLANNEL_NETWORK=172.100.0.0/16
FLANNEL_SUBNET=172.100.1.0/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
EOF

開啟網路

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
  1. master 節點配置

預設情況下叢集不會在master上排程pod,如果偏想在master上排程Pod,可以執行如下操作:

檢視 taint

 kubectl describe node master|grep -i taints

刪除預設汙點

kubectl taint nodes master node-role.kubernetes.io/master-

這個涉及 k8s 的 taint 汙點和 toleration 容忍機制,可以自己查閱文件。

Master Pod 配置例子

  1. 檢視 master 節點的 taint 配置
$ kubectl describe node master

檢視到 taint 配置為

...
Taints:             node.kubernetes.io/not-ready:NoExecute
                    node.kubernetes.io/not-ready:NoSchedule
                    key=value:PreferNoSchedule
...
  1. 在 Pod 中配置能夠分配 toleration,使其能夠分配使用

新增配置:

spec:
  tolerations:
  - key: node.kubernetes.io/not-ready
  operator: Exists
  effect: NoSchedule
  1. 執行 Pod
$ kubectl create -f mysql.yaml

$ kubectl describe pod mysql
...
Normal   Scheduled        4m35s                   default-scheduler  Successfully assigned default/mysql-rm2dv to master

...

啟動測試

啟動 nginx 例項並且訪問

  1. 命令方式
kubectl run httpd-app --image=httpd --replicas=3
  1. 配置檔案方式
$ cat >> nginx.yml << EOF
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      restartPolicy: Always
      containers:
      - name: nginx
        image: nginx:latest
EOF

$ kubectl apply -f nginx.yml 
  1. 狀態檢視
kubectl get nodes

kubectl get svc		# 檢視服務所開放的埠
  1. 檢視 pod 狀態
kubectl get pod --all-namespaces
  1. 檢視副本數目
kubectl get deployments

kubectl get pod -o wide
  1. 檢視叢集基本元件狀態
kubectl get cs
  1. 訪問

在其他機器上訪問即可,通過 nodePort 暴露埠。


漫長的過程,還有很多報錯和問題隨後再開個帖子記錄。

參考文章