1. Kubernetes简介
1.1简介
Kubernetes项目来源于Borg,可以说是集结了Borg设计思想的精华,并且吸收了Borg系统中的经验和教训。
在Docker 作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应用了很多年,Borg系统运行管理着成千上万的容器应用。
Kubernetes对计算资源进行了更高层次的抽象,通过将容器进行细致的组合,将最终的应用服务交给用户。
1.2优点
-
隐藏资源管理和错误处理,用户仅需要关注应用的开发。
-
服务高可用、高可靠。
-
可将负载运行在由成千上万的机器联合而成的集群中。
1.3设计架构
Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。
核心组件
etcd | 保存了整个集群的状态 |
apiserver | 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制 |
controller manager | 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等 |
scheduler | 负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上 |
kubelet | 负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理 |
Container runtime | 负责镜像管理以及Pod和容器的真正运行(CRI) |
kube-proxy | 负责为Service提供cluster内部的服务发现和负载均衡 |
除了核心组件,还有一些推荐的Add-ons:
kube-dns:负责为整个集群提供DNS服务
Ingress Controller:为服务提供外网入口
Heapster:提供资源监控
Dashboard:提供GUI
Federation:提供跨可用区的集群
Fluentd-elasticsearch:提供集群日志采集、存储与查询
分层结构
2.Kubernetes部署
2.1部署实验环境
- 需要四台虚拟机,在server1布置好habor仓库,其余作为Kubernetes节点都要满足内存大于1800MB,CPU不小于2
server1 | 私有仓库 | 172.254.77.1 |
server2 | 主控节点 | 172.25.77.2 |
server3 | 节点 | 172.25.77.3 |
server4 | 节点 | 172.25.77.4 |
- 因为后面所有的节点部署都是相同的,为方便操作提前设置免密
[root@server2 yum.repos.d]# ssh-keygen
[root@server2 yum.repos.d]# ssh-copy-id server3
[root@server2 yum.repos.d]# ssh-copy-id server3
- 关闭节点的selinux和iptables防火墙
- 开启server1的上的私有仓库
[root@server1 ~]# cd harbor/
[root@server1 harbor]# ls
[root@server1 harbor]# docker-compose start
2.2 所有节点部署docker引擎
配置源文件:
root@server2 ~]# cd /etc/yum.repos.d/
[root@server2 yum.repos.d]# ls
[root@server2 yum.repos.d]# scp docker.repo server3:/etc/yum.repos.d/ /源文件复制给节点
[root@server2 yum.repos.d]# scp docker.repo server4:/etc/yum.repos.d/
在所有节点(server2、server3、server4)中安装docker并设置开机自启
[root@server2 yum.repos.d]# yum install -y docker-ce
[root@server2 yum.repos.d]# systemctl enable --now docker
配置daemon.json
[root@server2 ~]# vim /etc/docker/daemon.json
{
“registry-mirrors”: [“https://reg.westos.org”],
“exec-opts”: [“native.cgroupdriver=systemd”],
“log-driver”: “json-file”,
“log-opts”: {
“max-size”: “100m”
},
“storage-driver”: “overlay2”
}
[root@server2 ~]# systemctl restart docker
剩余节点配置:
[root@server2 docker]# scp daemon.json server3:/etc/docker/
[root@server2 docker]# scp daemon.json server4:/etc/docker/
server4:[root@server4 ~]# systemctl restart docker
server3:[root@server3 ~]# systemctl restart docker
[root@server2 ~]# docker info
解决警告问题:
所有节点进行如下操作:
[root@server2 yum.repos.d]# cd /etc/sysctl.d
[root@server2 sysctl.d]# vim docker.conf
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
[root@server2 sysctl.d]# sysctl --system
在所有节点为仓库写解析
配置证书
将此前生成的证书发送给srver2(主控节点)
[root@server1 mnt]# cd /etc/docker
[root@server1 docker]# ls
[root@server1 docker]# scp -r certs.d/ server2:/etc/docker/
[root@server2 ~]# cd /etc/docker
[root@server2 docker]# ls
[root@server2 docker]# scp -r certs.d/ server3:/etc/docker/
[root@server2 docker]# scp -r certs.d/ server4:/etc/docker/
验证所有节点访问harbor私有仓库
[root@server2 docker]# docker pull busybox
[root@server3 ~]# docker pull busybox
[root@server4 ~]# docker pull busybox
拉取镜像前,首先确保自己的私有仓库里有这个镜像
2.3 所有节点禁止swap分区
[root@server2 docker]# swapoff -a
[root@server2 docker]# vim /etc/fstab //注释掉/etc/fstab文件中的swap定义
/dev/mapper/rhel-root / xfs defaults 0 0
UUID=d2b4bb78-5138-4096-afcf-ea6ae3526b71 /boot xfs defaults 0 0
#/dev/mapper/rhel-swap swap swap defaults 0 0
server3和server4中的步骤与上面server2中的步骤相同,所以省略
2.4安装部署软件kubeadm
安装软件
所有节点配置源文件从阿里云安装:
[root@server2 docker]# cd /etc/yum.repos.d/
[root@server2 yum.repos.d]# vim k8s.repo
[root@server2 yum.repos.d]# cat k8s.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
[root@server2 yum.repos.d]# scp k8s.repo server3:/etc/yum.repos.d/
[root@server2 yum.repos.d]# scp k8s.repo server4:/etc/yum.repos.d/
宿主机地址转发使得虚拟机能够连接外网
[root@localhost Desktop]# iptables -t nat -I POSTROUTING -s 172.25.77.0/24 -j MASQUERADE
所有节点安装并设置开机i自启:
yum install -y kubelet kubeadm kubectl
systemctl enable --now kubelet
主控节点(server2):
[root@server2 yum.repos.d]# kubeadm config print init-defaults //查看默认配置信息
[root@server2 yum.repos.d]# kubeadm config images list --image-repository //拉取镜像
registry.aliyuncs.com/google_containers
[root@server2 yum.repos.d]# kubeadm config images pull --image-repository //初始化集群
registry.aliyuncs.com/google_containers
拉取过程可能需要一段时间,耐心等待
将所需镜像上传到私有仓库
-
在harbor建立一个k8s项目
-
过滤出源地址
[root@server2 yum.repos.d]# docker images |grep registry.aliyuncs.com /
-
过滤出镜像名称
[root@server2 yum.repos.d]# docker images |grep registry.aliyuncs.com |awk '{print $1":"$2}'| awk -F/ '{print $3}' /
- 修改镜像标签
[root@server2 yum.repos.d]# docker images |grep registry.aliyuncs.com |awk '{print $1":"$2}'| awk -F/ '{print $3}' | awk '{system("docker tag registry.aliyuncs.com/google_containers/"$1" reg.westos.org/k8s/"$1"")}' /修改标签
[root@server2 yum.repos.d]# docker images |grep reg.westos.org /过滤查看
- 上传镜像到私有仓库
[root@server2 yum.repos.d]# docker login reg.westos.org 登陆仓库
[root@server2 yum.repos.d]# docker images |grep reg.westos.org | awk '{system("docker push "$1":"$2"")}' /上传镜像
- 验证:再次拉取非常快
[root@server2 yum.repos.d]# kubeadm config images list --image-repository reg.westos.org/k8s //列出镜像
[root@server2 yum.repos.d]# kubeadm config images pull --image-repository reg.westos.org/k8s //拉取镜像到本地速度非常快
初始化集群
[root@server2 yum.repos.d]# kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.westos.org/k8s
--pod-network-cidr=10.244.0.0/16 //使用flannel网络组件时必须添加
--kubernetes-version //指定k8s安装版本
初始化后,会得到一些提示:
[root@server2 yum.repos.d]# export KUBECONFIG=/etc/kubernetes/admin.conf 根据提示执行
查看Master状态,发现:因为缺少相关网络组件,master没有正常启用
[root@server2 yum.repos.d]# kubectl get node
[root@server2 yum.repos.d]# kubectl get pod -n kube-system
2.5安装flannel网络组件
[root@server2 ~]# docker pull quay.io/coreos/fannel:v0.14.0 /拉取fannel:v0.14.0
[root@server2 ~]# docker tag quay.io/coreos/flannel:v0.14.0 reg.westos.org/k8s /flannel:v0.14.0 /更改标签
[root@server2 ~]# docker push reg.westos.org/k8s/flannel:v0.14.0 /上传到仓库
[root@server2 ~ ]# yum install wget -y /安装下载工具
[root@server2 ~ ]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml /下载配置文件
[root@server2 ~]# vim kube-flannel.yml /修改配置文件
169 image: k8s/flannel:v0.14.0
183 image: k8s/flannel:v0.14.0
[root@server2 ~]# kubectl apply -f kube-flannel.yml /应用
查看状态:发现此时的master(主控节点)正常运行
[root@server2 ~]# kubectl get pod -n kube-system
[root@server2 ~]# kubectl get node
2.6节点扩容
根据之前集群初始化完成后的提示在server3和server4输入扩容命令:
kubeadm join 172.25.77.2:6443 --token ye5kwg.bqgzkttd7xjji7kd --discovery-token-ca-cert-hash sha256:d36073e942d364ddd37b08d5d9d77e60794b4e196255de6484749d2d1226f382
根据提示 在server1中查看节点状态:
[root@server2 ~]# kubectl get nodes
[root@server2 ~]# kubectl get pod -n kube-system
如下:扩容成功
2.8配置kubectl命令补齐功能
[root@server2 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@server2 ~]# source ~/.bashrc