K8s一主两从搭建
零 服务器准备
IP | 类别 | |
---|---|---|
172.16.56.102 | master | |
172.16.56.103 | Node1 | |
172.16.56.104 | Node2 |
一 准备工作
准备好一个主节点master的centos7.5以上的机器,准备相关相关环境的node节点机器
下载一个可以批量运维服务器的工具mobaXterm,这个工具暂时只支持windows,其下载地址为:
1 | https://mobaxterm.mobatek.net/download-home-edition.html |
二 初始化机器的配置信息[9步]
检查操作系统版本,确保操作系统版本是一致,并且大于7.5版本;
1
cat /etc/redhat-release
输出:
主机名解析
为了在集群环境中方便节点调用,配置主机解析功能,在企业内部应该使用DNS解析;
1
2
3
4在 /etc/hosts 文件中,添加主机名解析,如下
172.16.56.102 master
172.16.56.103 node1
172.16.56.104 node2上面的地址,就是我们给每个主机分配的ip地址,这个是固定的,我使用102做master节点,使用103、104分别做node1、node2节点;
时间同步
kebernetes在内部要求时间必须精确一致,这里使用chronyd服务从网络上同步时间;在生产环境中,应该使用企业内部的时间服务器,保证各个服务器时间一致。
1
2
3
4
5
61 启动chrondy服务
systemctl start chronyd
2 设置服务开机自启动
systemctl enable chronyd
3 查看时间是否一致,使用date验证
date禁用系统的iptables规则和firewalld规则
由于docker 和 kebernetes在运行时,会产生大量的iptables规则,为了不让系统的iptables规则和运行时产生的混淆,则关闭系统的iptables规则使用。
1
2
3
4
5
6
7
81 关闭firewalld
systemctl stop firewalld
2 重启取消自动重启
systemctl disable firewalld
3 关闭iptables
systemctl stop iptables
4 启动时取消自动重启
systemctl disable iptables本项目中时没有iptables的,所有关闭时会报错,直接跳过即可。
禁用selinux
selinux时linux的一个安全服务,如果不关闭,在安装集群中就会出现各种奇葩问题。
查看:
getenforce 输出 Enforcing
关闭:
1
2
3vim /etc/selinux/config
设置:
SELINUX=disable重启操作系统后,则会生效。
禁用swap分区
swap分区虚拟内存分区,是指在物理内存耗尽情况下,会将磁盘空间虚拟为内存使用。启用swap设备会对系统性能产生非常负面的影响。因此,kebernetes要求每个节点都禁用swap分区。如果关闭不了分区,则需要在集群安装过程中明确参数进行配置说明。
1
2
3分区的配置文件: /etc/fstab
注释掉swap分区最后一行
修改完毕后,需要重启linux操作系统修改linux内核参数
1
2
3
4
5
6修改linux内核参数,添加网桥过滤和地址转发功能
编辑/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 br_netfilter
结果如下:
配置ipvs功能
kubernetes中service对外提供服务,有两种代理模式,iptables和ipvs,从性能角度来看,ipvs性能优于iptables,如果要使用,需要手动载入ipvs模块。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21手动载入ipvs模块
1. 安装ipset 和ipvsadm
yum install ipset ipvsadm -y
2. 添加需要加载的模块脚本
cat <<EOF > /etc/sysconfig/modules/ipvs.modules
!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
3. 为添加的脚本添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
4. 执行脚本
/bin/bash /etc/sysconfig/modules/ipvs.modules
5. 查看对应的模块是否加载成功
lsmod |grep ip_vs如下图:
重启服务器
reboot
检查selinux安全检查,检查swap分区状态是否满足要求;
三 安装Kubernetes相关应用
docker安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
281. 切换镜像源
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
4. 添加一个配置文件
Docker在默认情况下使用的Cgroup Driver为cgroupfs, 而kubernetes推荐使用systemd来代替cgroupfs
mkdir /etc/docker
cat <<EOF > /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF
5. 查看docker版本
docker version
6. 重启docker
systemctl restart docker
7. 设置docker开机自动重启
systemctl enable docker安装kubernetes组件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
241. 切换国内的镜像源
cd /etc/yum.repos.d/
vim 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
2. 安装kubeadm、kubelet和kubectl
yum install —-setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
3. 配置kubelet的cgroup
编辑/etc/sysconfig/kubelet,添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
4. 设置kubelet开机自启
systemctl enable kubelet准备集群镜像
1
21. 查看kubeadm 目前需要的组件依赖
kubeadm config images list输出结果:
编写脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24cd ~
cat <<EOF > /root/kubernetes.sh
!/bin/bash
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
EOF
添加文件可执行权限:
chmod +x kubernetes.sh
运行添加镜像:
./kubernetes.sh等待安装成功,截图如下:
集群的初始化
4.1. 在master节点上进行集群的初始化
1
2
3
4
5kubeadm init \
--kubernetes-version=v1.17.4 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=172.16.56.102上述必须要保证有2核,如果一核就会报错。
要保证 kubelet是启动状态
内存一定要大一点,起码4G,否则会报错
重制: kubeadm reset
看节点: kubectl get pods -n kube-system
4.2. 创建必要文件
1
2
3mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config4.3. 让从节点加入到主节点中
1 | kubeadm join 172.16.56.102:6443 --token dy1nfq.xhcyreop4t3me22k \ |
4.4. 安装网络插件(在主节点上操作)
NotReady 未就绪,网络插件有fannel calico canal,只要给主节点配置即可。
使用flannel网络插件, 由于flannel插件使用官方的方式安装会报错,所以提前下载好flannel的包,然后倒入到docker环境中。
下载flannel.tar包,然后倒入:
docker load -i flannel.tar
下载flannel的yuml配置文件:
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
然后安装:
kubectl apply -f kube-flannel.yml
查看pods:
kubectl get pods -n kube-system -o wide
删除多余的pods:
kubectl delete pod Pod的名字 -n kube-system
查看pod的安装描述信息:
kubectl describe pod 名称 -n kube-system
查看nodes:
kubectl get nodes
四 测试Nginx
创建应用
1
kubectl create deployment nginx --image=nginx:1.14.2
暴露端口
1
kubectl expose deployment nginx --port=80 --type=NodePort
应用访问
- 删除应用
kubectl delete deployment nginx
删除serive
kubectl delete service,pods nginx -n kube-system
在node节点上查看
1
scp ~/.kube/ root@172.16.56.103:/root/