K8S学习
简介
MESOS apache 分布式资源框架 2019-5 twitter 宣布导向k8s
docker swarm 2019-07 阿里云宣布,Docker swarm 剔除。
k8s Google 10年容器化的基础架构。 borg。
特点:
轻量级:消耗小
开源:
弹性伸缩:
负载均衡:最新的版本是用IPVS框架。
基础概念
Brog

etcd

k8s

api server :所有服务访问的路口,充当网关的角色。
controllerManager:维持副本的期望数。
scheduler:调度器,负责接收任务,分配节点。
etcd:存储,持久化。
kubelet:直接跟容器引擎交互,实现容器的生命周期管理。
kubeproxy:负责写入规则到iptables、ipvs、firewalld等,实现服务映射。
coreDNS:为集群中的service提供域名解析。
DASHBOARD:提供B/S结构访问平台。
构建k8s集群
集群节点设置
安装环境
1、关闭防火墙
1 | # 关闭防火墙 |
2、关闭selinux
1 | 临时关闭 |
3、关闭swap分区
1 | 临时关闭 |
4、规划主机名设置
1 | hostnamectl set-hostname <hostname> |
5、在master中,设置相关的hosts
1 | cat >> /etc/hosts << EOF |
6、将桥接的IPv4流量全部转发到iptables的链中。
1 | cat >> /etc/sysctl.d/k8s.conf << EOF |
7、同步时间
1 | yum -y install ntpdate |
在所有节点安装Docker/kubeadm/kubelet
安装docker
k8s默认的CRI(容器运行时)是Docker,所以我们需要先安装Docker。
1 | 获取aliyundocker-ce源文件 |
添加aliyun的yum软件源
1 | cat > /etc/yum.repos.d/kubernetes.repo << EOF |
安装kubeadm,kubelet和kubectl
版本之间可能会存在兼容性问题,所以我们指定版本安装
1 | yum 安装kubelet和kubeadm以及kubectl |
部署Kubernetes master节点
在master节点上执行,这里是192.168.44.146。
1 | kubeadm init \ |
由于国内无法直接访问默认镜像仓库k8s.gcr.io,所以这里指定了aliyun的镜像仓库地址。
使用kubectl工具,需要配置一些项,如下图:
1 | mkdir -p $HOME/.kube |

部署Kubernetes Node节点
在子节点node中执行以下命令,将节点加入master主节点,这里是192.168.44.145和192.168.44.144两个node节点。
1 | kubeadm join 192.168.44.146:6443 --token 1jpl8j.dvxt8xtrhvp5kjyh \ |
默认生成的token有效期为24小时,所以当我们的token失效的时候,需要重新在master节点上重新创建token,具体创建的指令如下:
1 | 创建token命令 |

将子节点加入集群之后可以在master节点上执行命令kubectl get nodes
查看。

部署CNI网络组件
1 | 下载yml源 |

拉取镜像的时候出错了,如上图所示,Init:ImagePullBackOff
。原因:网络不好,拉取的时候超时了。
执行命令kubectl describe pod kube-flannel-ds-x56s9 --namespace=kube-system
查看错误原因,可以看到是pull的时候报错了,如下图所示。

解决方案:
1、等待k8s重试。
2、手动拉取镜像

查看了node节点状态,发现node2时候的,所以执行命令docker images
命令对比了两者的镜像差异,发现异常节点少了两个镜像。
异常节点k8snode1镜像如下:

正常节点k8snode2镜像如下:

对比发现,少了个异常节点镜像,所以执行命令docker save -o cni.tar.gz rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.0
打包缺少的镜像。
在异常节点k8snode1上执行命令docker load -i < cni.tar.gz
手动加载镜像。
3、重启docker服务。
重启k8snode1节点dockersystemctl restart docker.service
,之后Kubernetes会自动创建pods。
在master节点上执行命令kubectl get nodes
查看节点的状态,如下图:

测试Kubernetes集群
在Kubernetes集群中创建一个pod,验证是否正常。
1 | 拉去一个Nginx镜像 |
正在拉取中:

拉取并创建完成:

查看暴露的服务端口:

在本机电脑中使用k8snode1http://192.168.44.145:31259
或者在k8snode2http://192.168.44.122:31259
或者在master节点上,就可以正常访问Nginx服务器了。
