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

更新日期:2019年10月29日

内容简介

本文将介绍如何在CentOS 7上部署Kubernetes 1.7集群。

环境概述

操作系统: CentOS Linux release 7.5.1804 (Core)  
网络信息: 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

执行如下操作(在所有节点上)


#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

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

#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服务

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

#!/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

执行如下操作(在Master上)


# 使用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. 在工作节点上执行命令可以加入集群中。

# 在集群中部署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上)


# 加入到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

# 移除节点

-「How to gracefully remove a node from Kubernetes?

#!/bin/bash

kubectl get nodes

kubectl drain "<node-name>" --ignore-daemonsets --delete-local-data

kubectl delete node "<node-name>"

# 加入Master节点

#!/bin/bash

# 在主节点执行
kubeadm token create --print-join-command

# 在新的主机上执行,该主机会成为主节点加入
kubeadm join 10.10.50.91:6443 --experimental-control-plane \
    --token 608cyb.7polfq8iea971x9i \
    --discovery-token-ca-cert-hash sha256:8ff3e8899e47a10ee186319a737de85374ea7c4f4cf5276ef3d5b95f66b6ebbe

验证集群状态

在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

参考文献


ToC

内容简介

环境概述

将在Master上安装的组件

将在Node上安装的组件

执行如下操作(在所有节点上)

#1 操作系统环境初始化

#2 配置Kubernetes仓库

#3 安装Kubeadm与Docker服务

执行如下操作(在Master上)

# 使用kubeadm初始化

# 在集群中部署pod网络

执行如下操作(在Node上)

# 加入到Master节点中

# 移除节点

# 加入Master节点

验证集群状态

参考文献