目录
一、集群环境准备
- 集群环境安装要求
- 虚拟机服务器网络IP配置
- 主机名解析
- 其他配置
二、集群初始化
- 需要提前准备集群所需组件镜像
- kubernetes初始化集群
- 需要在master上面执行的操作
- 需要在node1、node2执行的命令
- 需要在master上面安装网络插件
- 报错解决
三、集群测试
- 部署一个Nginx浏览器访问测试
一、集群环境准备
1、集群环境安装要求
- 在所有节点上安装Docker 和kubeadm
- 角色 IP地址 组件
master 192.168.24.200 docker,kubectl,kubeadm,kubelet
node1 192.168.24.201 docker,kubectl,kubeadm,kubelet
node2 192.168.24.202 docker,kubectl,kubeadm,kubelet - 部署Kubernetes Master
- 部署容器网络插件
- 部署Kubernetes Node,将节点加入Kubernetes 集群中
- 部署Dashboard Web 页面,可视化查看Kubernetes 资源
在开始之前,部署Kubernetes 集群机器需要满足以下几个条件:
- 一台或多台机器,操作系统CentOS7.x-86_x64。虚拟机需要开三台Linux 服务器,系统为CentOS 7.5以上,下面以配置master为例,配置完成克隆出node1、node2然后修改对应的网络ip、主机名即可。三台服务器主机名分别设置为master、node1、node2,
- 硬件配置:2GB 或更多RAM,2 个CPU 或更多CPU,硬盘30GB 或更多
- 集群中所有机器之间网络互通
- 可以访问外网,需要拉取镜像
- 禁止swap 分区
# 此方式下安装kubernetes集群要求Centos版本要在7.5或之上
[root@kubertenes-master ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
2、虚拟机服务器网络IP配置
网络模式需要使用net模式而且需要找到自己的ip地址网段,因为如下图我的VMnet8的网段为192.168.24.0。
其实也就是网络适配器中的配置
具体的每个虚拟机网络ip的分配可以在安装完成之前可视化界面设置,这里不再截图,也可以安装完成后修改配置文件设置。
如果安装centOS系统完成之前忘记配置,也可以在安装之后使用vi /etc/sysconfig/network-scripts/ifcfg-ens33
编辑配置下图内容,参考
配置完成别忘记重启网络服务systemctl restart network
,然后可以使用xshell测试远程连接
3、主机名解析
然后就是修改hosts文件vi /etc/hosts
,配置主机名解析
# 主机名设置
hostnamectl set-hostname xxx
# 主机名成解析 编辑三台服务器的/etc/hosts文件,添加下面内容
192.168.24.200 master
192.168.24.201 node1
192.168.24.202 node2
4、其他配置
1.时间同步
# kubernetes要求集群中的节点时间必须精确一直,这里使用chronyd服务从网络同步时间,企业中建议配置内部的会见同步服务器
[root@kubertenes-master ~]# systemctl start chr
[root@kubertenes-master ~]# systemctl enable chronyd
[root@kubertenes-master ~]# date
2022年 05月 14日 星期六 10:32:42 CST
2.禁用iptable和firewalld服务
# kubernetes和docker 在运行的中会产生大量的iptables规则,
# 为了不让系统规则跟它们混淆,直接关闭系统的规则
[root@kubertenes-master ~]# systemctl stop firewalld
[root@kubertenes-master ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@kubertenes-master ~]# systemctl stop iptables
Failed to stop iptables.service: Unit iptables.service not loaded.
[root@kubertenes-master ~]# systemctl disable iptables
Failed to execute operation: No such file or directory
[root@kubertenes-master ~]#
3.禁用selinux
# selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
# 编辑 /etc/selinux/config 文件,修改SELINUX的值为disable
# 注意修改完毕之后需要重启linux服务
SELINUX=disabled
[root@kubertenes-master ~]# vi /etc/selinux/config
[root@kubertenes-master ~]#
4.禁用swap分区
# swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
# 编辑分区配置文件/etc/fstab,注释掉swap分区一行
# 注意修改完毕之后需要重启linux服务
[root@kubertenes-master ~]# vi /etc/fstab
# 注释掉 /dev/mapper/centos-swap swap
# /dev/mapper/centos-swap swap
5.修改linux的内核参数
# 修改linux的内核采纳数,添加网桥过滤和地址转发功能
# 编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:
[root@kubertenes-master ~]# vi /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
# 重新加载配置
[root@kubertenes-master ~]# sysctl -p
# 加载网桥过滤模块
[root@kubertenes-master ~]# modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
[root@kubertenes-master ~]# lsmod | grep br_netfilter
br_netfilter 22256 0
bridge 146976 1 br_netfilter
[root@kubertenes-master ~]#
6.配置ipvs功能
# 在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,
# ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
# 安装ipset和ipvsadm
[root@kubertenes-master ~]# yum install ipset ipvsadm -y
# 添加需要加载的模块写入脚本文件
[root@kubertenes-master ~]# cat <<EOF> /etc/sysconfig/modules/ipvs.modules
> modprobe -- ip_vs
> modprobe -- ip_vs_rr
> modprobe -- ip_vs_wrr
> modprobe -- ip_vs_sh
> modprobe -- nf_conntrack_ipv4
> EOF
[root@kubertenes-master ~]#
# 为脚本添加执行权限
[root@kubertenes-master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
# 执行脚本文件
[root@kubertenes-master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
# 查看对应的模块是否加载成功
[root@kubertenes-master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
nf_conntrack_ipv4 15053 0
nf_defrag_ipv4 12729 1 nf_conntrack_ipv4
ip_vs_sh 12688 0
ip_vs_wrr 12697 0
ip_vs_rr 12600 0
ip_vs 141432 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 133053 2 ip_vs,nf_conntrack_ipv4
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
[root@kubertenes-master ~]#
5、安装docker
# 1、切换镜像源
[root@kubertenes-master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 2、查看当前镜像源中支持的docker版本
[root@kubertenes-master ~]# yum list docker-ce --showduplicates
# 自行选择,可以选docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-stable
# 3、安装特定版本的docker-ce
# 必须制定--setopt=obsoletes=0,否则yum会自动安装更高版本
[root@kubertenes-master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
# 4、添加一个配置文件
#Docker 在默认情况下使用Vgroup Driver为cgroupfs,而Kubernetes推荐使用systemd来替代cgroupfs
[root@kubertenes-master ~]# mkdir /etc/docker
[root@kubertenes-master ~]# cat <<EOF> /etc/docker/daemon.json
> {
> "exec-opts": ["native.cgroupdriver=systemd"],
> // 1、安装Kubernetes组件
> // 2、准备集群镜像
> "registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
> }
> EOF
# 5、启动dokcer,此步报错的话参考解决然后重启服务器
[root@master ~]# systemctl restart docker
[root@master ~]# systemctl enable docker
6、安装Kubernetes组件kubeadm、kubelet和kubectl
一个kubernetes集群主要是由控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件。
master:集群的控制平面,负责集群的决策 ( 管理 )
- ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机
制 - Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上
- ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更
新等 - Etcd :负责存储集群中各种资源对象的信息
node:集群的数据平面,负责为容器提供运行环境 ( 干活 )
- Kubelet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器
- KubeProxy : 负责提供集群内部的服务发现和负载均衡
- Docker : 负责节点上容器的各种操作
下面,以部署一个nginx服务来说明kubernetes系统各个组件调用关系:
- 首先要明确,一旦kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中
- 一个nginx服务的安装请求会首先被发送到master节点的apiServer组件
- apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer
- apiServer调用controller-manager去调度Node节点安装nginx服务
- kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的podpod是kubernetes的最小操作单元,容器必须跑在pod中
- 至此,一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理这样,外界用户就可以访问集群中的nginx服务了
# 1、由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源
# 2、编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置
[root@kubertenes-master ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 3、安装kubeadm、kubelet和kubectl
[root@kubertenes-master ~] # yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
# 4、配置kubelet的cgroup
#编辑/etc/sysconfig/kubelet, 添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
# 5、设置kubelet开机自启
[root@kubertenes-master ~]# systemctl enable kubelet
二、集群初始化
kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署:
- 创建一个Master 节点
kubeadm init
,需要提前准备集群所需组件的镜像,这个过程就是组件镜像安装的过程 - 将Node 节点加入到当前集群中
$ kubeadm join <Master 节点的IP 和端口>
1、需要提前准备集群所需组件镜像
# 在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看
[root@kubertenes-master ~]# kubeadm config images list
I0514 11:51:45.295388 1779 version.go:251] remote version is much newer: v1.24.0; falling back to: stable-1.17
W0514 11:51:47.708570 1779 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0514 11:51:47.708609 1779 validation.go:28] Cannot validate kubelet config - no validator is available
k8s.gcr.io/kube-apiserver:v1.17.17
k8s.gcr.io/kube-controller-manager:v1.17.17
k8s.gcr.io/kube-scheduler:v1.17.17
k8s.gcr.io/kube-proxy:v1.17.17
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
# 使用下面命令分别拉取,直接在命令行复制执行即可
# 因为某些组件由于国外网站不能访问,暂时拉取不到,因此换aliyun镜像仓库拉取放到 k8s.gcr.io/$imageName 的中
images=(
kube-apiserver:v1.17.4
kube-controller-manager:v1.17.4
kube-scheduler:v1.17.4
kube-proxy:v1.17.4
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)
for imageName in ${images[@]};
do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
2、kubeadm初始化集群
注意:执行此步之前需要先将master克隆出node1、node2,并且修改对应的主机名,网络ip地址。保证互相之间能Ping通。
# 修改主机名
hostnamectl set-hostname xxx
# 编辑文件修改网络ip
vi /etc/sysconfig/network-scripts/ifcfg-ens33
2.1需要在master上面执行的操作
# 只需在master上面执行的
# apiserver-advertise-address=192.168.24.200 这里需要改成master的ip
[root@kubertenes-master ~]# kubeadm init \
--apiserver-advertise-address=192.168.24.200 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.17.4 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
# 执行完之后可以查看集群的节点,发现只有一个master节点
[root@kubertenes-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kubertenes-master NotReady master 5m13s v1.17.4
[root@kubertenes-master ~]#
接下来就是配置一个kubectl要使用到的配置文件
[root@kubertenes-master ~]# mkdir -p $HOME/.kube
[root@kubertenes-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@kubertenes-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@kubertenes-master ~]#
然后根据提示继续配置集群,将node1、node2加入集群
# 为集群部署一个pod执行命令
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.24.200:6443 --token mt04dr.dt6e656blc4cvbxs \
--discovery-token-ca-cert-hash sha256:2c116a6ecf6c52d0c62215514c9abb587bc897869af97ecd9fccf62e8328e7a8
2.2需要在node1、node2执行的命令
分别在node1、node2执行下面命令
[root@kubernetes-node1 ~]# kubeadm join 192.168.24.200:6443 --token mt04dr.dt6e656blc4cvbxs \
--discovery-token-ca-cert-hash sha256:2c116a6ecf6c52d0c62215514c9abb587bc897869af97ecd9fccf62e8328e7a8
[root@kubernetes-node2 ~]# kubeadm join 192.168.24.200:6443 --token mt04dr.dt6e656blc4cvbxs \
--discovery-token-ca-cert-hash sha256:2c116a6ecf6c52d0c62215514c9abb587bc897869af97ecd9fccf62e8328e7a8
# 然后执行kubectl get nodes查看集群节点,发现status是notready,原因是未安装网络插件
[root@kubertenes-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kubernetes-node1 NotReady <none> 3m21s v1.17.4
kubernetes-node2 NotReady <none> 3m2s v1.17.4
kubertenes-master NotReady master 13m v1.17.4
[root@kubertenes-master ~]#
2.3需要在master上面安装网络插件
# 方式1:直接下载,但是外网不一定成功
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 方式2:xftp连接上传文件kube-flannel.yml
# kube-flannel.yml的内容获取: https://github.com/flannel-io/flannel/tree/master/Documentation/kube-flannel.yml
# 安装
[root@kubertenes-master ~]# kubectl apply -f kube-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
[root@kubertenes-master ~]#
报错解决
# 此时可以使用kubectl get nodes 查看集群节点状态是否为ready
[root@kubertenes-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kubernetes-node1 NotReady <none> 16m v1.17.4
kubernetes-node2 NotReady <none> 16m v1.17.4
kubertenes-master NotReady master 26m v1.17.4
# 如果等待一会还是notready状态,则可以使用下列命令排查错误
[root@kubertenes-master ~]# journalctl -f -u kubelet.service
# 如果出现以下报错
5月 14 14:12:07 kubertenes-master kubelet[2798]: W0514 14:12:07.282699 2798 cni.go:237] Unable to update cni config: no networks found in /etc/cni/net.d
# 1. 则需要进行下面操作
[root@kubertenes-master ~]# mkdir -p /etc/cni/net.d
[root@kubertenes-master ~]# vim /etc/cni/net.d/10-flannel.conf
{
"name":"cbr0",
"cniVersion":"0.3.1",
"type":"flannel",
"deledate":{
"hairpinMode":true,
"isDefaultGateway":true
}
}
# 2. 在master节点之外的节点进行操作,重置集群
kubeadm reset
systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1
##重启kubelet
systemctl restart kubelet
##重启docker
systemctl restart docker
# 3. 配置完成之后再次查看节点状态
[root@kubertenes-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kubernetes-node1 Ready <none> 19m v1.17.4
kubernetes-node2 Ready <none> 19m v1.17.4
kubertenes-master Ready master 30m v1.17.4
# 4. 生成 新的token
[root@master ~]# kubeadm token create --print-join-command
三、集群测试
1、部署一个Nginx服务浏览器访问检测
接下来就是在集群中部署Nginx,检验集群环境
# 创建一个Nginx服务
[root@kubertenes-master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine
deployment.apps/nginx created
# 暴露端口
[root@kubertenes-master ~]# kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort
service/nginx exposed
# 查看服务
[root@kubertenes-master ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-6867cdf567-mb2dg 1/1 Running 0 35s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 45m
service/nginx NodePort 10.109.24.33 <none> 80:31050/TCP 15s
# 查看pod
[root@kubertenes-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6867cdf567-mb2dg 1/1 Running 0 9m32s
[root@kubertenes-master ~]#
浏览器测试结果