一文读懂kubernetes之集群测试环境搭建
一文读懂kubernetes之集群测试环境搭建,适合小白学习及上班族日常工作参考。
目录
更多精彩博文详见:
一、K8S概述
Kubernetes是 Google 团队发起并维护的开源容器集群管理系统,支持如 Docke 等容器技术。类似Docker Swarm ,使用 Kubernetes ,用户可以轻松搭建和管理一个私有容器云。
Kubernetes主要架构如下图所示:
(一)、控制节点(master)
集群的控制节点,负责集群的决策、管理,每个集群需要至少一个master节点负责集群的管控。
1、ApiServer
资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制。
2、Scheduler
负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上。
3、ControllerManager
负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等。
4、Etcd
负责存储集群中各种资源对象的信息。
(二)、工作节点(node)
集群的工作负载节点,负责为容器提供运行环境,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行。
1、Kubelet
负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器。
2、KubeProxy
负责提供集群内部的服务发现和负载均衡。
3、Docker
负责节点上容器的各种操作。
二、K8S集群环境搭建
(一)、集群简介
1、集群类型
(1)、一主多从
一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境。
(2)、多主多从
多台Master节点和多台Node节点,搭建麻烦,安全性高,适合用于生产环境。
2、安装方式
(1)、minikube
一个用于快速搭建单节点kubernetes的工具。
(2)、kubeadm(本次使用该方式安装部署)
一个用于快速搭建kubernetes集群的工具。
(3)、二进制包
从官网下载每个组件的二进制包,依次去安装,此方式对于理解kubernetes组件更加有效。
(二)、集群环境搭建
1、主机规划
节点角色 |
IP地址 |
系统版本 |
主机配置 |
Master |
192.168.110.100 |
CentOS 7.5 |
2C 2G 50G |
Node01 |
192.168.110.101 |
CentOS 7.5 |
2C 2G 50G |
Node02 |
192.168.110.102 |
CentOS 7.5 |
2C 2G 50G |
2、环境初始化
(1)、检查操作系统版本
kubeadm方式下安装kubernetes集群要求CentOS版本在7.5或以上。
Master\Node节点均要执行如下命令检查操作系统版本:
cat /etc/redhat-release
(2)、主机名解析
Master\Node节点均要执行
为方便集群节点间的调用,配置主机名解析,企业级推荐使用内部DNS服务器
- 修改hosts文件
vim /etc/hosts
添加如下内容:
192.168.110.100 master
192.168.110.101 node01
192.168.110.102 node02
- 修改主机名
vim /etc/hostname
修改为实际主机名。
(3)、时间同步
kubernetes要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间。企业中建议配置内部的时间同步服务器。
- 安装
sudo yum install chrony -y
- 启动chronyd服务
systemctl start chronyd
systemctl status chronyd
- 设置chronyd服务开机启动
systemctl enable chronyd
- chronyd服务启动后几分钟,使用date命令在master/node节点上验证时间是否一致
date
(4)、禁用iptables和firewalld服务
- 关闭firewalld服务
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld
- 关闭iptables服务
systemctl status iptables
systemctl stop iptables
systemctl disable iptables
(5)、禁用selinux
- 查看当前selinux状态
getenforce
- 修改配置文件关闭selinux
vim /etc/selinux/config
修改如下内容:
SELINUX=disabled
- 重启服务器生效
shutdown -r now
(6)、禁用swap分区
启用swap会对系统性能产生负面影响,因此kubernetes要求每个节点都禁用swap编辑分区配置文件,注释swap分区一行。
- 注释分区配置
vim /etc/fstab
注释如下配置:
/dev/mapper/centos-swap swap swap defaults 0 0
- 修改后重启服务器生效
shutdown -r now
(7)、修改Linux的内核参数
- 修改Linux的内核参数,添加网桥过滤和地址转发功能
vim /etc/sysctl.d/kubernetes.conf
添加如下配置:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
- 重新加载配置
sysctl -p
- 加载网桥过滤模块
modprobe br_netfilter
- 查看网桥过滤模块是否加载成功
lsmod | grep brnetfilter
(8)、配置ipvs功能
IPVS是Linux内核中的一个负载均衡模块,它能够快速、高效地分发网络请求。在Kubernetes中,使用IPVS可以实现高效的负载均衡和服务发现。
在kubernetes中service有两种代理模型,一种是基于iptables,一种是基于ipvs。ipvs性能要高一些,需要手动载入ipvs模块
- 安装ipset和ipvsadm
yum install ipset -y
yum install ipvsadm -y
- 添加需要加载的模块写入脚本
cat < /etc/sysconfig/modules/ipvs.modules
!/bin/bash
modprobe -- ipvs modprobe -- ipvsrr modprobe -- ipvswrr modprobe -- ipvssh modprobe -- nfconntrack_ipv4
EOF
- 为脚本文件添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
- 执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules
- 查看对应的模块是否加载成功
lsmod | grep -e ipvs -e nfconntrack_ipv4
3、安装docker
(1)、切换镜像源
cat /etc/yum.repos.d/docker-ce.repo
yum install -y wget
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
(2)、查看当前镜像源中支持的docker版本
yum list docker-ce --showduplicates
(3)、安装特定版本的docker-ce
必须指定--setopt=obsoletes=0,否则yum会自动安装更高版本
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
docker --version
(4)、添加一个配置文件
Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgoupfs
mkdir /etc/docker
cat < /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"],
"registry-mirrors":["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF
(5)、启动docker
systemctl status docker
systemctl restart docker
systemctl enable docker
(6)、检查docker状态和版本
docker version
4、安装kubernetes组件
由于kubernetes的镜像源在国外,速度慢,这里切换成国内的镜像源
- 修改镜像源
vim /etc/yum.repos.d/kubernetes.repo
添加如下配置:
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x8664 enabled=1 gpgcheck=0 repogpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
- 安装kubeadm、kubelet和kubectl
yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
- 配置kubelet的cgroup
vim /etc/sysconfig/kubelet
添加如下配置:
KUBELETCGROUPARGS="--cgroup-driver-systemd"
KUBEPROXYMODE="ipvs"
- 设置kubelet开机自启
systemctl enable kubelet
5、准备集群镜像
在安装kubernetes集群之前,需要提前准备好集群需要的镜像,所需镜像可以通过下面的命令查看
kubeadm config images list
- 下载镜像
此镜像在kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替代方案
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/googlecontainers/$imageName docker tag registry.cn-hangzhou.aliyuncs.com/googlecontainers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
- 下载完成后,查看镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/kube-proxy v1.17.4 6dec7cfde1e5 3 years ago 116MB
k8s.gcr.io/kube-apiserver v1.17.4 2e1ba57fe95a 3 years ago 171MB
k8s.gcr.io/kube-controller-manager v1.17.4 7f997fcf3e94 3 years ago 161MB
k8s.gcr.io/kube-scheduler v1.17.4 5db16c1c7aff 3 years ago 94.4MB
k8s.gcr.io/coredns 1.6.5 70f311871ae1 3 years ago 41.6MB
k8s.gcr.io/etcd 3.4.3-0 303ce5db0e90 3 years ago 288MB
k8s.gcr.io/pause 3.1 da86e6ba6ca1 5 years ago 742kB
6、集群初始化
下面的操作只需要在master节点执行
- 创建集群
kubeadm init --kubernetes-version=v1.17.4 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --apiserver-advertise-address=192.168.110.100
参数解释:
--apiserver-advertise-address:master节点的IP地址
执行初始化命令成功后,会输出如下内容:
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.110.100:6443 --token o24fso.8wt7z7y5s7xxymqu \
--discovery-token-ca-cert-hash sha256:cc381215b6d383e7f89eb36114460583cd7ea093a8ef6ea8d02d381be6fd341e
- 根据上面内容,执行如下命令
创建必要文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
下面的操作只需要在node节点执行:
- 将node节点加入集群
kubeadm join 192.168.110.100:6443 --token o24fso.8wt7z7y5s7xxymqu \
--discovery-token-ca-cert-hash sha256:cc381215b6d383e7f89eb36114460583cd7ea093a8ef6ea8d02d381be6fd341e
- 查看集群状态,此时集群状态为NotReady,这是因为还没有配置网络插件
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 13m v1.17.4
node01 NotReady 37s v1.17.4
node02 NotReady 30s v1.17.4
7、安装网络插件
kubernetes支持多种网络插件,比如flannel、calico、canal等,本次选择flannel
下面的操作只需要在master节点执行
(1)、获取flannel的配置文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- 修改配置文件中quay.io仓库为quay-mirror.qiniu.com
(2)、使用配置文件启动flannel
kubectl apply -f kube-flannel.yaml
- 稍等片刻,再次查看集群节点状态
kubectl get nodes
- 若安装kube-flannel后,master、node节点还是NotReady,则执行如下命令逐步排查
排查命令
kubectl -n kube-system get pods -o wide
kubectl logs kube-flannel-ds-amd64-kx4x9 -n kube-system
journalctl -f -u kubelet
看到报错:
[failed to find plugin "flannel" in path [/opt/cni/bin]]
解决方法:
(master、node节点都需要执行)
复制flannel文件到/opt/cni/bin/路径下,并添加执行权限
1、在百度网盘下载flannel文件
百度网盘链接:https://pan.baidu.com/s/1ZoHK2fxsx-U3qBhScgb92w
提取码:8888
2、把提取到的flannel复制或上传到/opt/cni/bin/
3、增加执行权限
chmod +x /opt/cni/bin/flannel
4、master节点看到节点状态
kubectl get nodes
至此,kubernetes的集群环境搭建完成!
(三)、服务部署测试
在kubernetes集群中部署一个Nginx程序,测试集群功能是否正常。
步骤一、部署Nginx
kubectl create deployment nginx --image=nginx:1.14-alpine
步骤二、暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
步骤三、查看服务状态
- 查看pod
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-6867cdf567-hz5s6 1/1 Running 0 30s
- 查看service
kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 109m
nginx NodePort 10.107.112.111 80:32127/TCP 7s
- 最后在电脑浏览器访问Nginx服务,通过master节点IP访问
http://192.168.110.100:32127/
出现 Welcome to nginx!
说明部署成功!
更多推荐
所有评论(0)