一、主机环境预设

1、测试主机说明

测试使用的 k8s 集群可由一个 master 主机及一个以上(建议至少两个)node 主机组成,这些主机可以是物理服务器,也可以是 vmware 等虚拟平台上的虚拟主机,甚至是云主机。

本测试环境由 vmvare 虚拟平台上三个独立虚拟主机组成,操作系统均为 CentOS 7.6.1810,各 ip 地址对应如下:

192.168.3.30 CentOs7.6 master
192.168.3.31 CentOs7.6 node1
192.168.3.32 CentOs7.6 node2

 

2、设定时钟同步

借助于 NTP服务设定各节点时间精确同步,若节点可以直接访问互联网,直接启动 chronyd 系统服务,并设定其随系统引导而启动,在各主机上分别执行:

~]# systemctl restart chronyd && systemctl enable chronyd 

不过建议用户配置使用本地的时间配置服务器,在节点数量众多时尤其如此。存在可用的本地时间服务器时,修改节点的 /etc/chrony.conf 配置文件,并将时间服务器指向响应的主机即可。

 

3、主机名称解析

出于简化配置步骤的目的,本次测试环境使用 /etc/hosts 文件进行各节点名称解析,在各节点分别执行:

~]# sed -i '$a\192.168.3.30 master\n192.168.3.31 node1\n192.168.3.32 node2' /etc/hosts

 

4、无密钥认证

为方便后面 master 向 node 传输文件时无需输入密码,在 master 上配置无密钥认证:

[root@master ~]# ssh-keygen -t rsa
# 一路回车
[root@master ~]# ssh-copy-id node1
# 输入 node1 主机 root 密码
[root@master ~]# ssh-copy-id node2
# 输入 node2 主机 root 密码

 

5、关闭 iptables 或 firewalld 服务

默认情况下,CentOS7.6.1810 只会安装 firewalld 服务,在各节点分别执行:

~]# systemctl stop firewalld && systemctl disable firewalld

 

6、关闭并禁用 SELinux

若各节点主机启用了SELinux,则需要修改 /etc/sysconfig/selinux 配置文件,禁用SELinux,并临时设置其状态为 permissive。在各节点分别执行:

~]# sed -i 's@^\(SELINUX=\).*@\1disabled@' /etc/sysconfig/selinux && setenforce 0

 

7、禁用 swap 设备

部署集群时,kubeadm 默认会预先检查当前主机是否禁用了 swap 设备,并在未禁用时强制终止部署过程。因此,在主机内存资源充裕的情况下,需要禁用所有的 swap 设备,否则就需要在后文的 kubeadm init 及 kubeadm join 命令执行时额外使用相关选项忽略检查错误。

关闭 swap 设备需要分两步完成。首先关闭当前所有的 swap 设备:

 ~]# swapoff -a

而后编辑 /etc/fstab 配置文件,注释掉用于挂载 swap 设备的所有行。

此次部署不禁用 swap 设备,在后面使用 kubeadm 命令时,额外使用相关选项来忽略检查错误。

 

8、启用 ipvs 内核模块

创建载入内核模块的脚本文件 /etc/sysconfig/modules/ipvs.modules ,内容如下:

#!/bin/bash
ipvs_mod_dir="/usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs"
for mod in $(ls $ipvs_mod_dir | grep -o "^[^.]*"); do
    /sbin/modinfo -F filename $mod &> /dev/null
    if [ $? -eq 0 ]; then
        /sbin/modprobe $mod
    fi
done

修改文件权限:

[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules

将该文件拷贝到各节点:

[root@master ~]# scp /etc/sysconfig/modules/ipvs.modules node1:/etc/sysconfig/modules/ipvs.modules
[root@master ~]# scp /etc/sysconfig/modules/ipvs.modules node2:/etc/sysconfig/modules/ipvs.modules

在各节点上分别执行该脚本:

~]# bash /etc/sysconfig/modules/ipvs.modules

 

二、安装程序包

1、yum 仓库配置

CentOS-Base.repo

[root@master ~]# cat /etc/yum.repos.d/CentOS-Base.repo 
[base]
name=CentOS-$releasever
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

[updates]
name=CentOS-$releasever
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

[extras]
name=CentOS-$releasever
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

docker-ce.repo

[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

kubernetes.repo

[root@master ~]# cat /etc/yum.repos.d/kubernetes.repo 
[kubernetes]
name=Kubernetes Repository
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
        https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg

将以上仓库配置文件拷贝到各 node 主机:

[root@master ~]# scp /etc/yum.repos.d/{CentOS-Base.repo,docker-ce.repo,kubernetes.repo} node1:/etc/yum.repos.d/
[root@master ~]# scp /etc/yum.repos.d/{CentOS-Base.repo,docker-ce.repo,kubernetes.repo} node2:/etc/yum.repos.d/

 

2、安装相关的程序包

在各节点上分别安装 docker-ce,kubectl,kubeadm,kubelet。

~]# yum -y install docker-ce kubectl kubeadm kubelet

 

3、配置 docker 及启动

docker 自 1.13 版本起会自动设置 iptables 的 FORWARD 默认策略为 DROP,这可能会影响 Kubernetes 集群所依赖的报文转发功能,因此需要在 docker 服务启动后,重新将 FORWARD 链的默认策略设为 ACCEPT,方式是修改 /usr/lib/systemd/system/docker.service 文件,在 ExecStart=/usr/bin/dockerd -H fd:// 之后新增一行,加入如下策略:

ExecstartPost=/usr/sbin/iptables -P FORWARD ACCEPT

另外,在该文件中设置阿里云镜像加速器地址,方式是在 ExecStart=/usr/bin/dockerd -H fd:// 文件末尾添加加速器地址:

--registry-mirror=https://nfszl7wl.mirror.aliyuncs.com

修改的这两行内容如下:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --registry-mirror=https://nfszl7wl.mirror.aliyuncs.com
ExecstartPost=/usr/sbin/iptables -P FORWARD ACCEPT

重载配置文件,并启动 docker,同时设置为开机自启:

[root@master ~]# systemctl daemon-reload && systemctl enable docker && systemctl start docker

使用 docker info 命令查看 docker 是否存在告警信息:

[root@master ~]# docker info
...
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

当 docker info 末尾出现上面的警告信息时,可在 /etc/sysctl.d/ 目录下新增配置文件,并手动指定其值为 1:

[root@master ~]# echo -e "net.bridge.bridge-nf-call-iptables = 1\nnet.bridge.bridge-nf-call-ip6tables = 1" > /etc/sysctl.d/k8s.conf

然后手动重载该文件后,重启 docker 即可。

[root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf 
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@master ~]# systemctl restart docker

将 /usr/lib/systemd/system/docker.service 和 /etc/sysctl.d/k8s.conf  文件拷贝至 node 节点:

[root@master ~]# scp /usr/lib/systemd/system/docker.service node1:/usr/lib/systemd/system/docker.service  
[root@master ~]# scp /usr/lib/systemd/system/docker.service node2:/usr/lib/systemd/system/docker.service  
[root@master ~]# scp /etc/sysctl.d/k8s.conf node1:/etc/sysctl.d/k8s.conf                                                                                                                 
[root@master ~]# scp /etc/sysctl.d/k8s.conf node2:/etc/sysctl.d/k8s.conf

在各 node 节点上分别执行:

~]# systemctl daemon-reload && systemctl enable docker && systemctl start docker

 

4、初始化 master 节点

编辑 /etc/sysconfig/kubelet 文件,忽略 kubelet 对 swap 时开启时的检查错误:

~]# sed -i '/KUBELET/s@$@"--fail-swap-on=false"@' /etc/sysconfig/kubelet

重启 kubelet 服务:

~]# systemctl restart kubelet

使用 kubeadm init 初始化一个 k8s 集群,在 master 节点上运行如下命令:

~]# kubeadm init --kubernetes-version="v1.14.2" --pod-network-cidr="10.244.0.0/16" --ignore-preflight-errors=Swap --dry-run

"""

☆☆☆☆☆ 各选项说明:

--kubernetes-version="v1.14.2"   ## 初始化的 k8s 集群的版本号

该版本号应该与 kubeadm 的版本号保持一致,查看 kubeadm 的版本可使用 如下命令:

 ~]# kubeadm version

--pod-network-cidr="10.244.0.0/16"  ## 设置网络插件

10.244.0.0/16 地址为 flannel 插件的默认地址

--ignore-preflight-errors=Swap  ## 忽略 kubeadm 对 swap 设备开启时的检查错误

--dry-run ## 不真正跑,测试执行一遍

"""

当执行上面的命令成功打印含有如下信息时,表示上面命令是 ok 的。

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 /tmp/kubeadm-init-dryrun122920222/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 192.168.3.30:6443 --token bqvqkl.y3vkbyxpoo0n4dl2 \
    --discovery-token-ca-cert-hash sha256:7bd4ef3f9760d9cbaf0f5415a38ce77e470f2c17d4272faadc3746ae34570a05 

查看初始化集群所需要用到的镜像文件:

~]# kubeadm config images list
I0604 06:41:09.820108   17387 version.go:96] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get https://dl.k8s.io/release/stable-1.txt: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
I0604 06:41:09.820308   17387 version.go:97] falling back to the local client version: v1.14.2
k8s.gcr.io/kube-apiserver:v1.14.2
k8s.gcr.io/kube-controller-manager:v1.14.2
k8s.gcr.io/kube-scheduler:v1.14.2
k8s.gcr.io/kube-proxy:v1.14.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1

使用 kubeadm 初始化 v1.14.2 集群时需要到用到上面 7 个镜像文件,如果本地无这些镜像文件,docker 会默认从 gcr.io 上拉取,但由于 google 的网络原因,目前国内是访问不到 gcr.io 的。可以关联 github 和 docker hub 账户,然后通过 github 中的 Dockerfile 从 gcr.io 拉取目标文件到 docker hub 中,即可通过 docker 拉取到本地。

~]# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/coredns                   1.3.1               b73e228e990c        3 days ago          40.3MB
k8s.gcr.io/etcd                      3.3.10              6d7c182bf92a        3 days ago          258MB
k8s.gcr.io/pause                     3.1                 e4304ad90c48        3 days ago          742kB
k8s.gcr.io/kube-proxy                v1.14.2             5d28fc806b08        3 days ago          82.1MB
k8s.gcr.io/kube-scheduler            v1.14.2             375d4d77b244        3 days ago          81.6MB
k8s.gcr.io/kube-controller-manager   v1.14.2             dd32b6aa25ac        3 days ago          158MB
k8s.gcr.io/kube-apiserver            v1.14.2             3ae3c7e243d8        3 days ago          210MB

所有镜像都准备好以后,可正式初始化 k8s 集群,执行如下命令:

~]# kubeadm init --kubernetes-version="v1.14.2" --pod-network-cidr="10.244.0.0/16" --ignore-preflight-errors=Swap

截取关键信息如下:

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 192.168.3.30:6443 --token cmb9v5.7v36ibka8nxj8o47 \
    --discovery-token-ca-cert-hash sha256:34a8d8d9a5f47f00711acc68a099b9c3f4f72ba2385aadda6769c3a20ea72bb3 

☆☆☆☆☆ 说明:当初始化成功以后,在打印的信息行末尾会生成 token 令牌,token 令牌用于从节点加入 k8s 集群的密钥认证,至关重要,所以应当保存下来。

另外,根据提示信息,还需做如下操作:

~]# mkdir ~/.kube
~]# cp /etc/kubernetes/admin.conf ~/.kube/config

查看主节点状态:

~]# kubectl get nodes   
NAME     STATUS     ROLES    AGE   VERSION
master   NotReady   master   48m   v1.14.2

状态为 NotReady,是因为网络插件还未部署,部署flannel网络插件:

~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

查看 kube-system 名称空间的相关 pod 是否运行:

~]# kubectl get pods -n kube-system
NAME                             READY   STATUS    RESTARTS   AGE
coredns-fb8b8dccf-645xm          1/1     Running   0          58m
coredns-fb8b8dccf-lxbqs          1/1     Running   0          58m
etcd-master                      1/1     Running   0          57m
kube-apiserver-master            1/1     Running   0          57m
kube-controller-manager-master   1/1     Running   0          57m
kube-flannel-ds-amd64-hw25w      1/1     Running   0          98s
kube-proxy-5cl8n                 1/1     Running   0          58m
kube-scheduler-master            1/1     Running   0          57m

当所有 pod 都运行时,再次查看主节点状态:

~]# kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   58m   v1.14.2

状态为 Ready ,主节点初始化成功。

 

5、配置 node 节点加入 master 集群

获取相关镜像如下:

~]# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/pause                     3.1                 e4304ad90c48        4 days ago          742kB
k8s.gcr.io/kube-proxy                v1.14.2             5d28fc806b08        4 days ago          82.1MB

编辑 /etc/sysconfig/kubelet 文件,忽略 kubelet 对 swap 时开启时的检查错误:

~]# sed -i '/KUBELET/s@$@"--fail-swap-on=false"@' /etc/sysconfig/kubelet

重启 kubelet 服务:

~]# systemctl restart kubelet

执行 token 令牌,加入 k8s 集群:

~]# kubeadm join 192.168.3.30:6443 --token cmb9v5.7v36ibka8nxj8o47 --discovery-token-ca-cert-hash sha256:34a8d8d9a5f47f00711acc68a099b9c3f4f72ba2385aadda6769c3a20ea72bb3 --ignore-preflight-errors=Swap

说明,除了执行加入 k8s 集群的工作令牌外,还附加了 "--ignore-preflight-errors=Swap" 选项,忽略 kubeadm 对 swap 时开启时的检查错误。

在 master 主机上查看各节点状态:

[root@master ~]# kubectl get nodes        
NAME     STATUS   ROLES    AGE    VERSION
master   Ready    master   36m    v1.14.2
node1    Ready    <none>   6m2s   v1.14.2
node2    Ready    <none>   3m3s   v1.14.2

 

6、附加配置

若要 node 节点也能执行 kubectl 相关操作,首先,在 node 节点 /root/ 目录下,创建 .kube 目录。

~]# mkdir ~/.kube

将 master 的 /etc/kubernetes/admin.conf 文件 拷贝到 node 节点 /root/.kube/ 目录下,并更名为 config 。

[root@master ~]# scp /etc/kubernetes/admin.conf node1:/root/.kube/config 
[root@master ~]# scp /etc/kubernetes/admin.conf node2:/root/.kube/config

然后在重节点即可执行 kubectl 相关操作:

[root@node1 ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE    VERSION
master   Ready    master   145m   v1.14.2
node1    Ready    <none>   39m    v1.14.2
node2    Ready    <none>   44m    v1.14.2

至此,一个简单的 k8s 集群搭建成功。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐