k8s(二)k8s 的安装步骤
k8s安装
首先需要完成对k8s的安装,k8s 的安装方式基本有2种;kubeadm工具安装和二进制文件方式安装
因为k8s的安装比较复杂 且容易出错,Kubernetes从1.4版本开始引入了命令行工具kubeadm,方便快速安装k8s.
下面会分别说明2种k8s的安装方式;
k8s的集群架构模式
k8s的集群架构 分为单master 和多master。对于node 一般肯定是多个的,而master可以1个或多个。当然为了高可用,可以选用多master的架构。但是多master架构的模式下,多个work node 需要一个负载均衡器来访问多个master.
k8s生产环境的要求配置说明

本次安装环境配置说明
k8s 支持多种容器引擎这里以docker来做说明
系统版本 centos7
虚拟机 3 台 配置 2core * 2G
docker版本 18.06.1-ce
k8s 版本 1.18.0
安装前的准备
安装k8s之前需要对linux系统做一些设置
主机上禁用SELinux,让容器可以读取主机文件系统
1
2
3
4
5
6
7
8
9
10> sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
需要重启
> setenforce 0 # 临时
验证成功:getenforce
Enforcing是开启状态
Permissive 是临时禁用了(警告模式,将该事件记录下来,依然允许执行)
disable 永久禁用了关闭防火墙,因集群环境设计到多个端口通信,在安全的内网中可以选择关闭
1
2> systemctl stop firewalld
> systemctl disable firewalld关闭swap
1 | > vim /etc/fstab #编辑文件然后将swap 注释了就关闭了swap了 或执行命令 sed -ri 's/.*swap.*/#&/' /etc/fstab |
执行free -m 看是否都为0 ,如果都为0 表示已经关闭了;
同步系统时间,防止因时间不一致导致的问题
1
2
3# 时间同步
yum install ntpdate -y
ntpdate time.windows.com
使用 kubeadm 工具安装
kubeadm 是官方提供的一个快速部署集群的工具。
主要的命令有 kubeadm init 初始化master节点
kubeadm join (mater address) work node 加入到master节点上
三台虚拟机机器的ip
master 192.168.199.113
node1 192.168.199.114
node2 192.168.199.115
为主机设置hostname(三台分别执行 )
分别再三台主机设置hostname
1
2
3hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2进入master主机 113的那台添加host映射和上面设置的hostname要一致
1
2
3
4
5cat >> /etc/hosts << EOF
192.168.199.113 master
192.168.199.114 node1
192.168.199.115 node2
EOF将桥接的IPv4流量传递到iptables的链 (三台都执行相同的)
1 | cat > /etc/sysctl.d/k8s.conf << EOF |
1 | sysctl --system # 生效 |
禁用swap
1
2swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久安装docker环境
下载docker的yum 镜像源
1
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
1
如果没有wget命令使用yum安装 yum install wget -y
yum安装docker
1
yum -y install docker-ce-18.06.1.ce-3.el7
启动docker服务
1
systemctl enable docker && systemctl start docker
验证安装是否成功
1
docker --version
配置可用的docker镜像源
1
2
3
4
5cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://reg-mirror.qiniu.com"]
}
EOF
重启docker
1
systemctl restart docker
使用docker info 查看是否生效

添加k8s的yum镜像源
1
2
3
4
5
6
7
8
9cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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安装kubeadm,kubelet和kubectl
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
systemctl enable kubelet

~初始化k8s master 节点
在master主机上执行
1
2
3
4
5
6kubeadm init \
--apiserver-advertise-address=192.168.199.113 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16apiserver-advertise-address master节点的地址
image-repository 镜像的仓库地址
kubernetes-version k8s版本号
service-cidr 服务的网段信息
pod-network-cidr pod的网段信息(不能和上面的相同)

在完成后会生成一个包含token的连接信息 ,其他的节点执行此命令就可以连接到master.
或者使用命令打印这个token 信息,token的有效期是24h
1
kubeadm token create --print-join-command
打印连接命令信息
接着执行命令生成配置文件等信息!
根据提示在master节点执行命令
1
2
3
4mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes可以使用docker images 看到拉取到的镜像信息;
docker ps 查看正在运行的容器信息

node 加入master节点
分别在所有的非master节点上执行
1
kubeadm join 192.168.199.113:6443 --token vv1m2b.vcvfi5pbe1qmaz3u --discovery-token-ca-cert-hash sha256:60cd6c9471f3cb4c8d84510091a1cd9649163c0a236255816eb923d2f21e482f

安装CNI(container network interface) 网络组件,只有安装了网络组件才能进行连通,才能正常的工作
k8s 服务并不包含网络的相关组件的安装,而是通过CNI的方式可以使用多种网络服务组件,比较常用的有 Flannel、Calico、Weave、Canal;
这里使用 Flannel 网络组件,当然也可以选用其他的网络组件;
master节点执行
1
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
1
kubectl get pods -n kube-system


此文件如果无法访问,可以先下载下来再放到服务器上执行
查看状态和测试是否成功
1
2
3
4
5
6
7
8查看node 状态
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 21h v1.18.0
node1 Ready <none> 21h v1.18.0
node2 Ready <none> 21h v1.18.0部署nginx
1
2
3
4
5
6#创建一个镜像为nginx的部署
kubectl create deployment nginx --image=nginx
#暴露部署node
kubectl expose deployment nginx --port=80 --type=NodePort
#获取pod的详细信息
kubectl get pod -o wide1
2//执行
kubectl get service1
2
3
4NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 22h
nginx NodePort 10.104.147.153 <none> 80:30255/TCP 3m54s那么使用: http:nodeIp:30255 即可映射到nginx的80端口
nodeIp 可以是集群中的任何一个物理Ip
安装中的问题
重启后docker启动错误
1
2Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
docker服务无法启动,大概率是 /etc/docker/daemon.json 此文件有问题;
- 检查此文件的内容和格式
- 检查此文件的读写权限
安装完毕CNI 网络后,有服务一直是pending 状态

kubectl get pods -A -o wide 查看详细的信息;
执行机器重启,全部重新启动,就可以了
查看具体对应的pod状态
1 | kubectl describe pod -n kube-system kube-flannel-ds-amd64-c4h6p |

内部可以看到对应的镜像,可以先手动拉取镜像
手动拉取完镜像后;
重新安装CNI
首先执行删除flannel
1
kubectl delete -f kube-flannel.yml
强制删除未运行的pod 删除
1
2
3
4
kubectl delete pod kube-flannel-ds-4wjrw --force --grace-period=0 -n kube-system
kubectl delete pod kube-flannel-ds-wjzll --force --grace-period=0 -n kube-system
kubectl delete pod kube-proxy-xm4w2 --force --grace-period=0 -n kube-system

然后再安装
1 | kubectl apply -f kube-flannel.yml |
发现仍然是pending状态;
- 节点 NotReady 问题
node1 和node2 都是notReady 状态
1 | [root@master ~]# kubectl get nodes |
使用 kubeadm reset 命令将安装重置,重新初始化
rm -rf $HOME/.kube
4.Failed to start ContainerManager failed to initialize top level QOS containers
出现node 节点上的kubelet 无法启动;
解决方式:
执行
参考链接 http://www.ichenfu.com/2019/12/06/kubelet-failed-to-initialize-top-level-qos-containers/



