Kubernetes(v1.17.3) + KubeSphere(最新)

Kubernetes、kubeSphere 部署说明

官网的版本更新迭代速度很快,网上的部署资料参差不齐。能够完整跑起来的可谓凤毛麟角。基于此做个备忘。

基础服务器列表

基础服务器及版本

从零开始,在干净的机器上安装 Docker、Kubernetes (使用 kubeadm)、Calico、Helm、NFS StorageClass,通过此备忘搭建一个学习环境的 Kubernetes集群,并在 Kubernetes 集群之上安装开源的 KubeSphere 容器平台可视化运营集群环境。

  • 为了部署一套能够正常使用的K8s环境。我将k8s的1.17.x、1.18.x、1.20.x版本都部署了一遍。后来发现kubeSphere最新版本不支持K8s的1.20.x

一、环境准备:

  • 三台及以上主机
  • 每台主机的主机名、Mac 地址、UUID 不相同
  • CentOS 7.x(本文用 7.6)
  • 每台机器最好有 2G 内存或以上
  • Control-plane/Master至少 2U 或以上
  • 各个主机之间网络相通
  • 禁用交换分区
  • 禁用 SELINUX
  • 关闭防火墙(也可以设置相关防火墙规则)

如果不关闭防火墙需要开放的端口列表参考:

Master节点
Worker节点

先进行防火墙、交换分区设置

# 为了方便本操作关闭了防火墙,也建议你这样操作
systemctl stop firewalld
systemctl disable firewalld

# 关闭 SeLinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

# 关闭 swap
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab

更换CentOS YUM源为阿里云yum源

# 安装wget
yum install wget -y
# 备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 获取阿里云yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 获取阿里云epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
# 清理缓存并创建新的缓存
yum clean all && yum makecache
# 系统更新
yum update -y

时间同步:

timedatectl
timedatectl set-ntp true

修改Hosts地址

# 所有节点执行
cat >> /etc/hosts << EOF
10.211.55.5    master
10.211.55.6    node01
10.211.55.7    node02
EOF

二、Docker安装

在每台机器上安装 Docker,我这里安装的是 docker-ce-20.10.1,具体步骤参考 CentOS 7.x 安装Docker或自行安装即可。

修改Cgroup Driver

需要将Docker 的 Cgroup Driver 修改为 systemd,不然在为Kubernetes 集群添加节点时会报如下错误:

[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/

查看docker当前的Cgroup Driver

$ docker info|grep "Cgroup Driver"
  Cgroup Driver: cgroupfs

需要将这个值修改为 systemd ,同时将registry替换成国内的仓库地址操作如下。

# Setup daemon.
cat > /etc/docker/daemon.json <

三、 安装kubeadm、kubelet 和 kubectl

  • kubeadm:用来初始化集群的指令
  • kubelet:在集群中的每个节点上用来启动 pod 和容器等
  • kubectl:用来与集群通信的命令行工具(Worker 节点可以不装)

更改源地址

# 所有节点执行

# 配置K8S的yum源 这部分用是阿里云的源,如果可以访问Google,则建议用官方的源,官方源参考下面的配置。两个配置选其一即可。
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

官网源

# 官方源配置如下
cat < /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=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

开始安装

安装指定版本 kubelet、 kubeadm 、kubectl,这里安装的是 Kubernetes 1.17.3,如果选择的版本不一样,在执行集群初始化的时候,注意 –kubernetes-version 的值是你的对应版本。

# 增加配置
cat < /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 加载
sysctl --system

# 安装
yum install -y kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3 --disableexcludes=kubernetes

# 启动并设置 kubelet 开机启动
systemctl start kubelet
systemctl enable --now kubelet

⚠️ 如果安装K8s的最新版本,请检查KubeSphere是否支持该版本

四、Kubeadm创建集群

初始化 Control-plane/Master 节点

在master节点上使用 kubeadm init 命令执行初始化。首先会执行一系列的运行前检查来确保机器满足运行 Kubernetes 的条件,这些检查会抛出警告并在发现错误的时候终止整个初始化进程。 一切就绪后kubeadm init 会下载并安装集群的 Control-plane 组件。

# master节点执行

kubeadm init \
 --apiserver-advertise-address 0.0.0.0 \
 --apiserver-bind-port 6443 \
 --cert-dir /etc/kubernetes/pki \
 --control-plane-endpoint master \
 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
 --kubernetes-version 1.17.3 \ 
 --pod-network-cidr 10.10.0.0/16 \
 --service-cidr 10.20.0.0/16 \
 --service-dns-domain cluster.local \
 --upload-certs

参数介绍

# 初始化 Control-plane/Master 节点
kubeadm init \
    --apiserver-advertise-address 0.0.0.0 \
    # API 服务器所公布的其正在监听的 IP 地址,指定“0.0.0.0”以使用默认网络接口的地址
    # 切记只可以是内网IP,不能是外网IP,如果有多网卡,可以使用此选项指定某个网卡
    --apiserver-bind-port 6443 \
    # API 服务器绑定的端口,默认 6443
    --cert-dir /etc/kubernetes/pki \
    # 保存和存储证书的路径,默认值:"/etc/kubernetes/pki"
    --control-plane-endpoint master \
    # 为控制平面指定一个稳定的 IP 地址或 DNS 名称,
    # 这里指定的 master 已经在 /etc/hosts 配置解析为本机IP
    --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
    # 选择用于拉取Control-plane的镜像的容器仓库,默认值:"k8s.gcr.io"
    # 因 Google被墙,这里选择国内仓库
    --kubernetes-version 1.17.3 \
    # 为Control-plane选择一个特定的 Kubernetes 版本, 默认值:"stable-1"
    --node-name master01 \
    #  指定节点的名称,不指定的话为主机hostname,默认可以不指定
    --pod-network-cidr 10.10.0.0/16 \
    # 指定pod的IP地址范围
    --service-cidr 10.20.0.0/16 \
    # 指定Service的VIP地址范围
    --service-dns-domain cluster.local \
    # 为Service另外指定域名,默认"cluster.local"
    --upload-certs
    # 将 Control-plane 证书上传到 kubeadm-certs Secret

等待一段时间....

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/

You can now join any number of the control-plane node running the following command on each as root:

# ⚠️⚠️⚠️ 添加集群master节点的需要执行的命令
  kubeadm join kuber4s.api:6443 --token 0j287q.jw9zfjxud8w85tis \
    --discovery-token-ca-cert-hash sha256:5e8bcad5ec97c1025e8044f4b8fd0a4514ecda4bac2b3944f7f39ccae9e4921f \
    --control-plane --certificate-key 528b0b9f2861f8f02dfd4a59fc54ad21e42a7dea4dc5552ac24d9c650c5d4d80

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

# ⚠️⚠️⚠️ 添加集群work节点需要执行的命令
kubeadm join kuber4s.api:6443 --token 0j287q.jw9zfjxud8w85tis \
    --discovery-token-ca-cert-hash sha256:5e8bcad5ec97c1025e8044f4b8fd0a4514ecda4bac2b3944f7f39ccae9e4921f

为普通用户添加 kubectl 运行权限,命令内容在初始化成功后的输出内容中可以看到。

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

将master节点上的$HOME/.kube/config 文件拷贝到node节点对应的文件中

# 在node01、node02节点分别执行一遍如下命令

1.创建目录,这里的路径为/root
mkdir -p $HOME/.kube 

2.把master节点上的config文件拷贝到node1和node2的$HOME/.kube
scp k8s-master1:~/.kube/config $HOME/.kube

3.修改权限
chown $(id -u):$(id -g) $HOME/.kube/config

这样修改后,在所有节点上执行kubctl命令时,不会出现如下错误:

The connection to the server localhost:8080 was refused - did you specify the right host or port?

备份好 kubeadm init 输出中的 kubeadm join 命令,集群添加节点时会执行该命令。也可以通过如下命令查看token信息

# 在master节点使用如下命令查看token
$ kubeadm token list
TOKEN                     TTL       EXPIRES                     USAGES                   DESCRIPTION   EXTRA GROUPS
px979r.mphk9ee5ya8fgy44   20h       2020-03-18T13:49:48+08:00   authentication,signing           system:bootstrappers:kubeadm:default-node-token
            
            
# 查看sha256
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
# 5e7c7cd1cc1f86c0761e54b9380de22968b6b221cb98939c14ab2942223f6f51

# 同时查看token和sha256
$ kubeadm token create --print-join-command
kubeadm join 10.211.55.5:6443 --token 9b28zg.oyt0kvvpmtrem4bg     --discovery-token-ca-cert-hash sha256:5e7c7cd1cc1f86c0761e54b9380de22968b6b221cb98939c14ab2942223f6f51

将Node01、Node02加入到集群中

# 在Node01、Node02 分别执行如下命令将work节点加入集群。

kubeadm join 10.211.55.5:6443 --token 9b28zg.oyt0kvvpmtrem4bg     --discovery-token-ca-cert-hash sha256:5e7c7cd1cc1f86c0761e54b9380de22968b6b221cb98939c14ab2942223f6f51


# 输出:
输出结果  
[preflight] Running pre-flight checks
    [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.16" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Activating the kubelet service
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

Master节点查看node,发现状态都是NotReady,因为还没有安装网络插件,这里我们安装calio

kubectl get nodes
NAME         STATUS     ROLES    AGE     VERSION
master    NotReady   master   19m     v1.16.9
node01    NotReady      4m10s   v1.16.9
node02    NotReady      4m3s    v1.16.9

Master节点安装网络插件

  • 安装Pod网络插件,以使Pod可以相互通信,只需要在Master节点操作,其他新加入的节点会自动创建相关pod。
  • 注意需要在部署应用程序之前部署网络组件。另外,在安装网络之前,CoreDNS将不会启动(你可以通过命令 kubectl get pods –all-namespaces|grep coredns 查看 CoreDNS 的状态)。
# 查看 CoreDNS 的状态,并不是 Running 状态
$ kubectl get pods --all-namespaces|grep coredns
kube-system   coredns-7f9c544f75-bzksd    0/1   Pending   0     14m
kube-system   coredns-7f9c544f75-mtrwq    0/1   Pending   0     14m

kubeadm 支持多种网络插件,我们选择 Calico 网络插件(kubeadm 仅支持基于容器网络接口(CNI)的网络),默认情况下,它给出的pod的IP段地址是 192.168.0.0/16 ,如果你的机器已经使用了此IP段,就需要修改这个配置项,将其值改为在初始化 Master 节点时使用 kubeadm init –pod-network-cidr=x.x.x.x/x 的IP地址段,即我们上面配置的 10.10.0.0/16(根据自己需求修改,但是注意要一致),大概在625行左右,操作如下:

# 下载文件
mkdir calico && cd calico
wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml
  
# 修改配置文件
# 找到 625 行左右的 192.168.0.0/16 ,并修改为我们初始化时配置的 10.10.0.0/16
vim calico.yaml
  
# 修改完成后安装calico网络插件
kubectl apply -f calico.yaml

# 安装完成后稍等一会查看pods状态,可能有的节点还在下载镜像
kubectl get pods -n kube-system

NAME                                      READY   STATUS    RESTARTS   AGE
calico-kube-controllers-dc6cb64cb-8sh59   1/1     Running   0          6m22s
calico-node-89s9k                         1/1     Running   0          6m22s
calico-node-dkt7w                         1/1     Running   0          6m22s
calico-node-tgg2h                         1/1     Running   0          6m22s
coredns-667f964f9b-7hrj9                  1/1     Running   0          33m
coredns-667f964f9b-8q7sh                  1/1     Running   0          33m
etcd-k8s-master                           1/1     Running   0          33m
kube-apiserver-k8s-master                 1/1     Running   0          32m
kube-controller-manager-k8s-master        1/1     Running   0          33m
kube-proxy-b2r5d                          1/1     Running   0          12m
kube-proxy-nd982                          1/1     Running   0          11m
kube-proxy-zh6cz                          1/1     Running   0          33m
kube-scheduler-k8s-master                 1/1     Running   0          32m


# 查看node状态
[root@k8s-master ~]# kubectl get nodes 
NAME         STATUS   ROLES    AGE     VERSION
master   Ready    master   31m     v1.16.9
node1    Ready       9m46s   v1.16.9
node2    Ready       9m22s   v1.16.9

其他

  • kubeadm init 初始化 Kubernetes 主节点
  • kubeadm token 管理 kubeadm join 的令牌
  • kubeadm reset 将 kubeadm init 或 kubeadm join 对主机的更改恢复到之前状态,一般与 -f 参数使用
  • 移除 worker 节点
    正常情况下,你无需移除 worker 节点,如果要移除,在准备移除的 worker 节点上执行
kubeadm reset -f
  • 或在Master上执行
# 节点名称可以在master上通过kubectl get nodes获得
kubectl delete node 节点名称

到此一个简单的K8s集群部署完成了。其他版本也是类似操作。下篇文章将在此基础上部署KubeSphere管理k8s集群。

你可能感兴趣的:(Kubernetes(v1.17.3) + KubeSphere(最新))