赞
踩
Kubernetes(k8s)有以下3种主流安装部署方式:
①Minikube安装
②kubeadm方式安装k8s
③二进制方式部署
本文采用第二种方法进行k8s部署。
kubernetes版本更新迭代非常快,现在已经更新到v1.20。本篇文章基于kubeadm搭建kubernetes v1.18.8版,其中docker的版本为19.03.12。
环境准备
机器名称 | 机器配置 | 机器系统 | IP地址 | 角色 |
---|---|---|---|---|
master1 | 2CPU 2G内存 | CentOS 7.9 | 172.16.55.201 | 主节点 |
node1 | 2CPU 2G内存 | CentOS 7.9 | 172.16.55.202 | 工作节点1 |
node2 | 2CPU 2G内存 | CentOS 7.9 | 172.16.55.203 | 工作节点2 |
说明:
master采用单节点;
硬件配置要求:2CPU 内存2G +;
操作系统要求:CentOS7 +
若未安装wget,请先安装wget:
[root@master1 ~]# yum -y install wget
[root@master1 ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
[root@master1 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/CentOS-7.repo
[root@master1 ~]# yum clean all
[root@master1 ~]# yum makecache
[root@master1 ~]# systemctl stop firewalld #临时关闭防火墙
[root@master1 ~]# systemctl disable firewalld #永久关闭防火墙
[root@master1 ~]# setenforce 0 #临时关闭selinux
[root@master1 ~]# sed -i ‘s/^SELINUX=.*/SELINUX=disabled/’ /etc/selinux/config #永久关闭selinux
[root@master1 ~]# swapoff -a #临时关闭swap
[root@master1 ~]# sed -i ‘s/enforcing/disabled/’ /etc/selinux/config #永久关闭swap
[root@master1 ~]#
cat >> /etc/hosts << EOF
172.16.55.201 master1
172.16.55.202 node1
172.16.55.203 node2
EOF
[root@master1 ~]# yum install chrony -y
[root@master1 ~]# systemctl start chronyd
[root@master1 ~]# systemctl enable chronyd
[root@master1 ~]# chronyc sources
让iptables能查看桥接流量
[root@master1 ~]#
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
[root@master1 ~]# sysctl --system
[root@master1 ~]# modprobe – ip_vs
[root@master1 ~]# modprobe – ip_vs_rr
[root@master1 ~]# modprobe – ip_vs_wrr
[root@master1 ~]# modprobe – ip_vs_sh
[root@master1 ~]# modprobe – nf_conntrack_ipv4
[root@master1 ~]# lsmod | grep ip_vs
[root@master1 ~]# lsmod | grep nf_conntrack_ipv4
[root@master1 ~]# yum install -y ipvsadm
[root@master1 ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
或者
[root@master1 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@master1 ~]# yum list docker-ce --showduplicates | sort -r #查看所有的docker-ce版本
[root@master1 ~]# yum list docker-ce-cli --showduplicates | sort -r #查看所有的docker-ce-cli版本
[root@master1 ~]# yum install -y docker-ce-19.03.12-3.el7 docker-ce-cli-19.03.9-3.el7 #安装指定版本(若只指定docker-ce版本,docker-ce-cli则会安装最新版本)
[root@master1 ~]# docker --version
Docker version 19.03.12, build 48a66213fe
[root@master1 ~]# systemctl enable docker
[root@master1 ~]# systemctl start docker
网上有很多大佬无私地提供了一些dockerhub加速地址,可以选择1个或多个使用。
[root@master1 ~]#
cat > /etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://1nj0zren.mirror.aliyuncs.com",
"https://kfwkfulq.mirror.aliyuncs.com"
]
}
EOF
[root@master1 ~]# systemctl restart docker
[root@master1 ~]# docker info | grep “Cgroup Driver”
Cgroup Driver: systemd
kubernetes官方建议docker驱动采用systemd,当然可以不修改,只是kubeadm init时会有warning([WARNING IsDockerSystemdCheck]: detected “cgroupfs” as the Docker cgroup driver. The recommended driver is “systemd”. Please follow the guide at https://kubernetes.io/docs/setup/cri/)可以忽略,生产环境建议修改,因为更稳定。
因为国内无法访问kubernents的官方yum源,所以需要修改
[root@master1 ~]#
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
查看kubernetes版本
[root@master1 ~]# yum list kubelet --showduplicates | sort -r
[root@master1 ~]# yum -y install kubelet-1.18.8 kubeadm-1.18.8 kubectl-1.18.8 #安装指定版本
[root@master1 ~]# kubelet --version
Kubernetes v1.18.8
设置kubelet,增加配置信息如果不配置kubelet,可能会导致K8S集群无法启动。为实现docker使用的cgroupdriver与kubelet 使用的cgroup的一致性。
[root@master1 ~]#vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=“–cgroup-driver=systemd”
[root@master1 ~]# systemctl start kubelet
[root@master1 ~]# systemctl enable kubelet
此时kubelet处于不断重启状态,因为集群还没有初始化,kubelet等待kubeadm初始化完成后运行状态正常。
[root@master1 ~]# kubeadm config images list
W0822 15:58:54.182176 25602 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
k8s.gcr.io/kube-apiserver:v1.18.8
k8s.gcr.io/kube-controller-manager:v1.18.8
k8s.gcr.io/kube-scheduler:v1.18.8
k8s.gcr.io/kube-proxy:v1.18.8
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7
如果是第一次安装k8s,手里没有备份好的镜像,可以执行如下操作备份。
查看安装集群需要的镜像
[root@master1 ~]# kubeadm config images list
编写执行脚本
[root@master1 ~]# mkdir -p /root/data && cd /root/data
[root@master1 ~]# vi images.sh
#!/bin/bash #下面的镜像应该去除"k8s.gcr.io"的前缀,版本换成kubeadm config images list命令获取到的版本 images=( kube-apiserver:v1.18.8 kube-controller-manager:v1.18.8 kube-scheduler:v1.18.8 kube-proxy:v1.18.8 pause:3.2 etcd:3.4.3-0 coredns:1.6.7 ) 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
给脚本授权并执行脚本
[root@master1 ~]# chmod +x images.sh
执行脚本
[root@master1 ~]# ./images.sh
保存Master镜像:
[root@master1 ~]#
docker save -o k8s.1.18.8.tar \
k8s.gcr.io/kube-proxy:v1.18.8 \
k8s.gcr.io/kube-apiserver:v1.18.8 \
k8s.gcr.io/kube-controller-manager:v1.18.8 \
k8s.gcr.io/kube-scheduler:v1.18.8 \
k8s.gcr.io/coredns:1.6.7 \
k8s.gcr.io/etcd:3.4.3-0 \
k8s.gcr.io/pause:3.2
保存Node镜像:
[root@master1 ~]#
docker save -o k8s.1.18.8.node.tar \
k8s.gcr.io/kube-proxy:v1.18.8 \
k8s.gcr.io/pause:3.2
导入镜像
[root@master1 ~]# docker load -i k8s.1.18.8.tar
[root@master1 ~]#scp k8s.1.18.8.node.tar root@172.16.55.202:/root
[root@node1 ~]#docker load -i k8s.1.18.8.node.tar
[root@master1 ~]#scp k8s.1.18.8.node.tar root@172.16.55.203:/root
[root@node2 ~]#docker load -i k8s.1.18.8.node.tar
初始化集群需使用kubeadm init命令,可以指定具体参数初始化,也可以指定配置文件初始化。
可选参数:
–apiserver-advertise-address apiserver的监听地址,有多块网卡时需要指定
–apiserver-bind-port apiserver的监听端口,默认是6443
–cert-dir 通讯的ssl证书文件,默认/etc/kubernetes/pki
–control-plane-endpoint 控制台平面的共享终端,可以是负载均衡的ip地址或者dns域名,高可用集群时需要添加
–image-repository 拉取镜像的镜像仓库,默认是k8s.gcr.io
–kubernetes-version 指定kubernetes版本
–pod-network-cidr pod资源的网段,需与pod网络插件的值设置一致
–service-cidr service资源的网段
–service-dns-domain service全域名的后缀,默认是cluster.local
[root@master1 ~]# kubeadm init --kubernetes-version=v1.18.8 --apiserver-advertise-address 0.0.0.0 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr 172.16.0.0/16 --service-cidr 10.10.0.0/16 --ignore-preflight-errors=Swap
–kubernetes-version 请指定为你需要安装的v1.18.8及以下的版本。
初始化成功后会最下面的返回信息会出现 kubeadm join…命令
配置kubectl与kube-apiserver交互:
[root@master1 ~]# mkdir -p $HOME/.kube
[root@master1 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master1 ~]# sudo chown
(
i
d
−
u
)
:
(id -u):
(id−u):(id -g) $HOME/.kube/config
至此可以使用kubectl查看集群节点状态,此时返回的节点状态为NotReady,待安装网络组件完成之后状态变为Ready
[root@master1 ~]# kubectl get nodes
修改kube-proxy的configmap:
[root@master1 ~]# kubectl edit cm kube-proxy -n=kube-system
修改 mode: ipvs
若执行kubectl报错
The connection to the server localhost:8080 was refused−did you specify the right host or port?
解决:
方式一:编辑文件设置
[root@master1 ~]# vi /etc/profile
在底部增加新的环境变量
export KUBECONFIG=/etc/kubernetes/admin.conf
方式二:直接追加文件内容
[root@master1 ~]# echo “export KUBECONFIG=/etc/kubernetes/admin.conf” >> /etc/profile
使其生效
[root@master1 ~]# source /etc/profile
[root@master1 ~]# curl https://docs.projectcalico.org/manifests/calico.yaml -O
或者
[root@master1 ~]# wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml
[root@master1 ~]# kubectl apply -f calico.yaml
稍等几分钟再来看节点状态,已经正常
查组件状态
[root@master1 ~]# kubectl get cs
若组件状态Unhealthy:
原因1:
这两个pod的非安全端口没有开启,健康检查时报错,但是由于本身服务是正常的,只是健康检查的端口没启,所以不影响正常使用。
解决办法:
开启scheduler, control-manager的10251,10252端口
修改以下配置文件:
进入静态pod的路径:
[root@master1 ~]# cd /etc/kubernetes/manifests
[root@master1 ~]# vi kube-scheduler.yaml,把port=0那行注释
[root@master1 ~]# vi kube-controller-manager.yaml,把port=0那行注释
以上则是master全部步骤,接下来就是添加node节点,master跟node的区别就是master需要初始化并配置网络组件,而node不需要初始化,安装后直接输入ip跟token加入集群即可。
[root@node1 ~]# kubeadm join 172.16.55.201:6443 --token 7ofrkh.laf5f4yku8na043s
–discovery-token-ca-cert-hash sha256:43bff6f15c054d6ba49ab37c3d8609fdd043433928f5280af365cbda3e150ba4
同样的操作将第二个worker节点加入集群。
再次查看集群状态
[root@master1 ~]# kubectl get nodes
[root@master1 ~]# kubectl get pods -A
如果join的token之前没有记住,没关系,在master重新生成一下
[root@master1 ~]# kubeadm token create --print-join-command
可以看到节点和个组件的pod状态均正常,至此集群搭建完毕!
[root@master1 ~]# kubectl get pods -n kube-system
集群已经准备完成,测试下kubernetes集群
在Kubernetes集群中创建一个pod,验证是否正常运行:
创建nginx容器
[root@master1 ~]# kubectl create deployment nginx --image=nginx
暴露对外端口
[root@master1 ~]# kubectl expose deployment nginx --port=80 --type=NodePort
查看nginx是否运行成功
[root@master1 ~]# kubectl get pod,svc
在浏览器访问NGINX。三个结点都可访问,即说明集群已经搭建完成。
扩容nginx副本wei3个,成功
[root@master1 ~]# kubectl scale deployment nginx --replicas=3
[root@master1 ~]# kubectl get pods
到此,kubeadm方式安装k8s就完成了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。