「k8s」- 部署k8s 1.7集群(在CentOS 7上)

更新日期:2019年08月12日

环境概述

k8s-master: 172.16.0.125

k8s-node01: 172.16.0.126

k8s-node02: 172.16.0.127

k8s-node03: 172.16.0.128

从主节点开始,我们使用'kubeadm'和'kubectl'命令管理集群及其节点。

将在Master上安装的组件

Kubectl utility / API Server / Scheduler / Controller Manager / etcd

将在Node上安装的组件

Kubelet / Kube-Proxy / Pod

执行如下操作(在Master上)


#1 环境初始化

#!/bin/sh

################################################################################
# 设置关闭防火墙
################################################################################
systemctl stop firewalld && systemctl disable firewalld

################################################################################
# 设置关闭SELINUX
################################################################################
setenforce 0
vim /etc/selinux/config
> SELINUX=disabled

################################################################################
# 关闭Swap分区
################################################################################
swapoff -a && sysctl -w vm.swappiness=0
vi /etc/fstab
> # UUID=7bff6243-324c-4587-b550-55dc34018ebf swap swap defaults 0 0

#2 配置Kubernetes仓库

#!/bin/sh

################################################################################
# 使用官方的镜像站(如果网络不通,就换阿里的镜像站)
################################################################################
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
        https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

################################################################################
# 使用阿里的镜像站
# https://mirrors.aliyun.com/kubernetes/yum/
################################################################################
cat <<EOF > /etc/yum.repos.d/kubernetes-ali.repo
[kubernetes-ali]
name=Kubernetes ALi
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

################################################################################
# 更新YUM缓存
################################################################################
yum makecache

#3 安装Kubeadm与Docker服务

#!/bin/sh

yum install -y kubeadm docker

# 如果没有「start」服务,则在「kubeadm init」时会有错误,因为在初始化的时候需要拉去镜像,该动作需要Docker服务处于运行中。
# 如果没有「enable」服务,则在「kubeadm init」时会有警告。
systemctl restart docker && systemctl enable docker

# 如果没有「enable」服务,则在「kubeadm init」时会有警告。
# 但是,不要「start」服务,这时候还没有初始化完成,缺少启动服务的某些配置文件(比如/var/lib/kubelet/config.yaml文件)。
# 感谢大佬的反馈 :-)
systemctl enable kubelet

#4 使用kubeadm初始化

使用官方镜像初始化(可能会失败):

#!/bin/sh

################################################################################
# 进行初始化(估计也会失败,因为他会去k8s.gcr.io拉镜像,又是墙里墙外的问题)
################################################################################
kubeadm init

如果使用官方镜像初始化失败,我们就改用阿里云的镜像来初始化:

#!/bin/sh

# 初始化(依旧使用阿里云的镜像)
kubeadm init --image-repository registry.aliyuncs.com/google_containers

# 如下块的内容是部署「1.7」时遗留下来的,基本不重要了(在部署「1.15.2」时有了更好方式,我就是不舍删):

#!/bin/sh

# TL;DR 
################################################################################
# 在初始化失败后,其中一个解决方法是「拉取镜像,然后打标签」,这个太麻烦了。
# http://blog.itpub.net/25854343/viewspace-2636166/
# 
# 
# 另外一个方法是更换镜像仓库,使用「index.docker.io/mirrorgooglecontainers」仓库。
# 在使用「index.docker.io/mirrorgooglecontainers」仓库拉取镜像之前,要先做一些事情:
# 		(1)这个仓库里没有coredns的镜像,所以要先拉取一下;
#		(2)然后,为拉取的coredns镜像打标签;
################################################################################
# 拉取coredns镜像并创建标签。注意,「打标签时的地址」要与「kubeadm拉取镜像的地址」相同
docker pull coredns/coredns:1.3.1
docker tag docker.io/coredns/coredns:1.3.1 index.docker.io/mirrorgooglecontainers/coredns:1.3.1

# 初始化
kubeadm init --image-repository index.docker.io/mirrorgooglecontainers

# TIPS: 使用「kubeadm config images list」命令查看需要的镜像及版本。

kubeadm init执行结束后,留意下面的输出:

# …………
#
# Your Kubernetes control-plane has initialized successfully!
#
# To start using your cluster, you need to run the following as a regular user:
#
#   mkdir -p $HOME/.kube
#   sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
#   sudo chown $(id -u):$(id -g) $HOME/.kube/config
#
# You should now deploy a pod network to the cluster.
# Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
#   https://kubernetes.io/docs/concepts/cluster-administration/addons/
#
# Then you can join any number of worker nodes by running the following on each as root:
#
# kubeadm join 172.31.253.28:6443 --token dui0g7.vzeubdwe3akafoez \
#     --discovery-token-ca-cert-hash sha256:63b5f94be088b8f865fc99ba095483e1999f1d7256cf3c1dc46a6a1246b9fe66
#

# 1. 提示你初始化成功
# 2. 然后,执行下面的三条命令
# 3. 告诉你应该向集群中部署一个Pod网络,这一点参考官方中列出的网络选择
# 4. 在工作节点上执行命令可以加入集群中。

#5 在集群中部署pod网络

正如在kubeadm init输出中所提示的,我们需要在集群中部署Pod网络。在部署的Pod网络中,不同主机的Pod就可以互相访问。Pod网络是工作节点之间的覆盖网络。更多的网络策略可以参考「Networking and Network Policy」一文。

这里只是为了快速开始,所以部署了「Weave Net」网络(后面可以更换为其他网络):

#!/bin/sh

# 创建网络
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

# 然后,执行如下命令查看状态
kubectl get nodes
kubectl get pods --all-namespaces

# !!!「nodes」要处于「Ready」状态,「pod」要处于「running」状态
# !!!当显示「ContainerCreating」时,表示正在创建,稍安勿燥

执行如下操作(在Node上)


#1 环境初始化

#!/bin/sh

# 关闭SELinux模块(略过)

# 配置防火墙(略过)

# 加载内核模块
modprobe br_netfilter
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

#2 配置Kubernetes仓库

与之前部分中的「配置Kubernetes仓库」一样的,这里直接使用阿里云的镜像:

#!/bin/sh

################################################################################
# 使用阿里的镜像站
################################################################################
cat <<EOF > /etc/yum.repos.d/kubernetes-ali.repo
[kubernetes-ali]
name=Kubernetes ALi
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

# 更新缓存
yum makecache

#3 安装Kubeadm与Docker服务

与Master的初始化相同,也是安装「kubadm」和「Docker服务」,但是不需要启动「kublet服务」:

#!/bin/sh

yum install kubeadm docker -y

systemctl restart docker && systemctl enable docker

systemctl enable kubelet

#4 加入到Master节点中

#!/bin/sh

kubeadm join 172.31.253.28:6443 --token dui0g7.vzeubdwe3akafoez \
    --discovery-token-ca-cert-hash sha256:63b5f94be088b8f865fc99ba095483e1999f1d7256cf3c1dc46a6a1246b9fe66

# !!! error execution phase preflight: unable to fetch the kubeadm-config ConfigMap: failed to get config map: Unauthorized
# !!! 遇到这错误是因为--token选项的TOKEN时效了(部署MASTER和NODE我间隔了很久),口令是有生存时间(TTL)的。
# !!! 使用kubeadm token create命令重新创建token口令(在Master上执行)。
# !!! https://github.com/kubernetes/kubeadm/issues/1310
# !!! 或者执行kubeadm token create --print-join-command命令,重新生成JOIN命令

# 重新生成token值
kubeadm token create

# 如果token过期了,创建永不过期的token值(不建议)
kubeadm token create --ttl 0

验证集群状态

在Master上执行命令检查Node是否成功加入:

#!/bin/sh

kubectl get nodes
# NAME         STATUS   ROLES    AGE     VERSION
# k8s-master   Ready    master   25h     v1.14.0
# k8s-node01   Ready    <none>   7m19s   v1.14.0

参考文献



Backlinks: 00.INDEX

ToC

环境概述

将在Master上安装的组件

将在Node上安装的组件

执行如下操作(在Master上)

#1 环境初始化

#2 配置Kubernetes仓库

#3 安装Kubeadm与Docker服务

#4 使用kubeadm初始化

#5 在集群中部署pod网络

执行如下操作(在Node上)

#1 环境初始化

#2 配置Kubernetes仓库

#3 安装Kubeadm与Docker服务

#4 加入到Master节点中

验证集群状态

参考文献