架构师的成长之路初片~Virtual-kubernetes——云平台部署
官方IP https://kubernetes.io/docs/home/
Kubernetes(K8S)
Google为创造者,2014年宣布开源
为什么要使用k8s?
有大量跨主机的容器需要管理
快速部署应用
快速扩展应用
无缝对接新的应用功能
节省资源,优化硬件资源的使用
为什么需要K8s?
因为容器在编排、管理和调度等各个方面,管理不易。将Docker应用于具体的业务实现,较为困难。
K8S是什么?
K8s是容器集群管理系统,可实现容器集群的自动化部署、自动扩缩容、维护等功能
K8S集群核心角色
master(管理节点)
apiserver\scheduler\etcd\controllermanager
node(计算节点)
kubelet\kube-proxy\docker
image(镜像仓库)
K8S集群架构图解
角色与功能
K8S master节点(管理节点)
Master提供集群的控制
对集群进行全局的决策
检测和响应集群事件
Master主要由apiserver,scheduler,etcd和controllermanager服务组成
K8S node节点(计算节点)
运行实际容器节点
维护运行Pod,并提供具体应用的运行环境
node由kubelet、kube-proxy和docker组成
计算节点被设计成水平扩展,该组件在多个节点上运行
环境:
按照如下配置准备云主机 主机名 IP地址 最低配置 master 192.168.1.21 2CPU,2G内存 node-0001 192.168.1.31 2CPU,2G内存 node-0002 192.168.1.32 2CPU,2G内存 node-0003 192.168.1.33 2CPU,2G内存 registry 192.168.1.100 1CPU,1G内存
内核版本 >=3.10 /uname -r
最低配置2cpu,2G内存
节点之中不可以有重复的主机名、MAC地址....
卸载防火墙 /rpm -evh firewalld-*
禁用swap /free -m
禁用selinux /cat /etc/selinux/conf
K8S集群安装部署
1:私有镜像仓库:
2:Master安装部署
2.1安装工具部署
2.2服务镜像部署
2.3:master安装
3:node安装部署
3.1:token管理
3.2:node安装
------------------------------------------------------------------------------
1:私有镜像仓库:
1:安装仓库服务 [root@registry ~]# yum makecache [root@registry ~]# yum install -y docker-distribution [root@registry ~]# systemctl enable --now docker-distribution
2:使用脚本初始化仓库
拷贝云盘 kubernetes/v1.17.6/registry/myos目录 到 仓库服务器
[root@registry ~]# cd myos
[root@registry ~]# chmod 755 init-img.sh
[root@registry ~]# ./init-img.sh
[root@registry ~]# curl http://192.168.1.100:5000/v2/myos/tags/list
{"name":"myos","tags":["nginx","php-fpm","v1804","httpd"]}
脚本:
yum install -y docker-ce mkdir -p /etc/docker cat >/etc/docker/daemon.json <<'EOF' { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": ["https://hub-mirror.c.163.com"], "insecure-registries":["192.168.1.100:5000", "registry:5000"] } EOF systemctl enable --now docker.service systemctl restart docker.service docker load -i myos.tar.gz # init apache images cat >Dockerfile<<'EOF' FROM myos:latest ENV LANG=C WORKDIR /var/www/html/ EXPOSE 80 CMD ["/usr/sbin/httpd", "-DFOREGROUND"] EOF docker build -t 192.168.1.100:5000/myos:httpd . # init php-fpm images cat >Dockerfile<<'EOF' FROM myos:latest EXPOSE 9000 WORKDIR /usr/local/nginx/html CMD ["/usr/sbin/php-fpm", "--nodaemonize"] EOF docker build -t 192.168.1.100:5000/myos:php-fpm . # init nginx images cat >Dockerfile<<'EOF' FROM myos:latest EXPOSE 80 WORKDIR /usr/local/nginx/html CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"] EOF docker build -t 192.168.1.100:5000/myos:nginx . # upload images rm -f Dockerfile docker tag myos:latest 192.168.1.100:5000/myos:v1804 for i in v1804 httpd php-fpm nginx;do docker push 192.168.1.100:5000/myos:${i} done
内部还有2个centos及..容器的镜像
安装Master
API Server
是整个系统的对外接口,供客户端和其他组件调用
后端元数据存储与etcd中(键值数据库)
Scheduler
负责对集群内部的资源进行调度,类似与“调度室”
Controller manager
负责管理控制器,相当于“大总管”
etc键值管理
采用键值对的形象存储信息
服务端口
安装软件包:
kubeadm\kubectl\kubelet\docker-ce
[root@master ~]# yum makecache [root@master ~]# yum install -y kubeadm kubelet kubectl docker-ce [root@master ~]# mkdir -p /etc/docker [root@master ~]# vim /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": ["https://hub-mirror.c.163.com"], "insecure-registries":["192.168.1.100:5000", "registry:5000"] //指定仓库 } [root@master ~]# systemctl enable --now docker kubelet [root@master ~]# docker info |grep Cgroup //查看状态 Cgroup Driver: systemd [root@master ~]# vim /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 //开启桥设备内核监控功能(ipv6) net.bridge.bridge-nf-call-iptables = 1 //开启桥设备内核监控功能(ipv4) net.ipv4.ip_forward = 1 //开启路由转发 [root@master ~]# modprobe br_netfilter //加载内核模块 [root@master ~]# sysctl --system //加载上面的k8s.conf配置文件
4:镜像导入私有仓库
# 把云盘 kubernetes/v1.17.6/base-images 中的镜像拷贝到 master [root@master ~]# cd base-images/ [root@master base-image]# for i in *.tar.gz;do docker load -i ${i};done [root@master base-image]# docker images [root@master base-image]# docker images |awk '$2!="TAG"{print $1,$2}'|while read _f _v;do docker tag ${_f}:${_v} 192.168.1.100:5000/${_f##*/}:${_v}; docker push 192.168.1.100:5000/${_f##*/}:${_v}; docker rmi ${_f}:${_v}; done # 查看验证 [root@master base-image]# curl http://192.168.1.100:5000/v2/_catalog //查看仓库中的镜像,是否上传完成
5、Tab键设置
由于k8s的命令长,所以我们导入tab健的命令
[root@master ~]# kubectl completion bash >/etc/bash_completion.d/kubectl [root@master ~]# kubeadm completion bash >/etc/bash_completion.d/kubeadm [root@master ~]# exit
6、安装IPVS代理软件包
[root@master ~]# yum install -y ipvsadm ipset
7、配置主机名
[root@master ~]# vim /etc/hosts 192.168.1.21 master 192.168.1.31 node-0001 192.168.1.32 node-0002 192.168.1.33 node-0003 192.168.1.100 registry
8、使用kubeadm部署
应答文件在云盘的 kubernetes/v1.17.6/config 目录下
生成 kubeadm-init.yaml 文件的命令 :
kubeadm config print init-defaults > kubeadm-init.yaml
应答文件在云盘的 kubernetes/v1.17.6/config 目录下 [root@master ~]# mkdir init;cd init # 拷贝 kubeadm-init.yaml 到 master 云主机 init 目录下 [root@master init]# kubeadm init --config=kubeadm-init.yaml |tee master-init.log # 根据提示执行命令 [root@master init]# mkdir -p $HOME/.kube [root@master init]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@master init]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
9、验证安装结果
[root@master ~]# kubectl version [root@master ~]# kubectl get componentstatuses NAME STATUS MESSAGE ERROR controller-manager Healthy ok scheduler Healthy ok etcd-0 Healthy {"health":"true"}
计算节点安装
1:获取master的token
# 创建token [root@master ~]# kubeadm token create --ttl=0 --print-join-command [root@master ~]# kubeadm token list # 获取token_hash [root@master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt |openssl rsa -pubin -outform der |openssl dgst -sha256 -hex
2、node安装
拷贝云盘上 kubernetes/v1.17.6/node-install 到跳板机 [root@ecs-proxy ~]# cd node-install/ [root@ecs-proxy node-install]# vim files/hosts ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 192.168.1.21 master 192.168.1.31 node-0001 192.168.1.32 node-0002 192.168.1.100 registry [root@ecs-proxy node-install]# vim node_install.yaml ... ... vars: master: '192.168.1.21:6443' token: 'fm6kui.mp8rr3akn74a3nyn' token_hash: 'sha256:f46dd7ee29faa3c096cad189b0f9aedf59421d8a881f7623a543065fa6b0088c' ... ... [root@ecs-proxy node-install]# ansible-playbook node_install.yaml
3、验证安装
[root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady master 130m v1.17.6 node-0001 NotReady <none> 2m14s v1.17.6 node-0002 NotReady <none> 2m15s v1.17.6 节点 就绪状态
网络插件安装配置
软件地址:https://github.com/coreos/flannel 资源文件:kube-flannel.yml 镜像文件:flannel.tar.gz
拷贝云盘 kubernetes/v1.17.6/flannel 目录到 master 上
1、上传镜像到私有仓库
[root@master ~]# cd flannel [root@master flannel]# docker load -i flannel.tar.gz [root@master flannel]# docker tag quay.io/coreos/flannel:v0.12.0-amd64 192.168.1.100:5000/flannel:v0.12.0-amd64 [root@master flannel]# docker push 192.168.1.100:5000/flannel:v0.12.0-amd64
2、修改配置文件并安装
[root@master flannel]# vim kube-flannel.yml 128: "Network": "10.244.0.0/16", 172: image: 192.168.1.100:5000/flannel:v0.12.0-amd64 186: image: 192.168.1.100:5000/flannel:v0.12.0-amd64 227-结尾: 删除 [root@master flannel]# kubectl apply -f kube-flannel.yml
3、验证结果
[root@master flannel]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 26h v1.17.6 node-0001 Ready <none> 151m v1.17.6 node-0002 Ready <none> 152m v1.17.6
---flannel理论---
Flannel实质上是一种“覆盖网络(overlay network)”,也就是将tcp数据包装在另一种网络包里面进行路由转发和通信,目前已经
支持UDP、VxLAN\AWS\VPC和GCE路由等数据转发方式
使用flannel目标
不同主机内的容器实现互联互通
结构图如下:
软件地址: https://github.com/coreos/flannel
资源文件: kube-flannel.yml
镜像文件: flannel.tar.gz