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 暴露端口。


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

參考文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章