Kubernetes 单master集群部署
一、主机环境预设1、测试主机说明测试使用的 k8s 集群可由一个 master 主机及一个以上(建议至少两个)node 主机组成,这些主机可以是物理服务器,也可以是 vmware 等虚拟平台上的虚拟主机,甚至是云主机。本测试环境由 vmvare 虚拟平台上三个独立虚拟主机组成,操作系统均为 CentOS 7.6.1810,各 ip 地址对应如下:192.168.3.30 C...
一、主机环境预设
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 集群搭建成功。
更多推荐
所有评论(0)