当前最流行的开源容器集群调度方案,实现自动化部署,扩容,维护等功能
k8s对象组件
Node工作节点
- 负责应用运行(生产环境至少需要三个工作节点)
- 单Node上可工作数个Pod
- 运行三项关键服务
- Kubelet:节点上的集群客户端,负责节点管理及对master通信的代理
- Kube Proxy:维护网络以支持Service服务层
- Container Runtime:容器运行时交互
Master管理节点
- 负责集群调度
- 运行关键服务
- Kube API Server:提供Kube Api服务
- Etcd:集群内部一致性、可用性数据存储
- Kube Scheduler:调度Pod到合适Pod上运行
- Kube Controller Manager
- Kube DNS
ReplicaSet
- 工作在master节点上,下一代的Replication Controller
- 主要被Deployments用作pod的管理调度
Pod容器组
- 在Node上创建,非持久化
- 包含一组相互间可localhost通信、关系紧密的容器(共享存储卷、分配的cluster-ip、运行信息)
- 容器应用的基本管理单元,可接受EndPoint请求
Deployment
- 部署pod容器组,并监控管理
- master node上Controller Manager的一部分
Service服务
- 一组后端Pods的抽象并提供稳定的服务入口,实现集群内部服务发现+负载均衡,同时也可对外暴露服务
- 会分配到一个cluster-ip(是个VirtualIP,ping不通)
Service对象类型
- ClusterIP:默认方式,服务仅开放到集群内网IP(通过kube-proxy调用iptables创建规则将流量转发到pod中,直接ping不通,因为不存在绑定的实际网络设备)
- NodePort:在集群所有woker node静态端口NAT映射到ClusterIP服务(可对外暴露服务,端口范围30000~32767)
- LoadBalancer:在支持的云厂商上自动创建L4 LBS节点并路由到NodePort服务(可对外暴露服务)
- ExternalName:基于CNAME机制使用字符串来开放服务
端口类别:
- TargetPort:Pod开放的端口
- Port:Service开放的虚拟服务端口,其对接的EndPoints为下属Pod的TargetPort
- NodePort:service对外的公网的端口
从简单到复杂可以分成三类
- 无状态服务:RS维护Pod,Service开放接口
- 普通有状态服务:通过Volume和Persistent Volume实现状态保存
- 有状态集群服务
- Init Container:做初始化工作的容器(可多个,顺序执行完后启动主容器)
- Stateful Set
- 基于PV/PVC获得稳定存储
- 基于Headless Service获得稳定网络身份
- 序号命名规则
StatefullSet
- 用于管理部署有状态应用
DaemonSet
- 确保选定节点上始终有指定pod运行
Ingress
- 作为公网访问集群后端服务的入口,是Service Nodeport等之外更高级的服务暴露模型
- 功能包括:集群外部的L7负载均衡+服务发现、反向代理,SSL截断,虚拟主机头访问
- 仅能在标准80/443口上暴露服务,可配置http访问规则,包括:host、path
- 驻留在control plane节点上,不占用work node的主机端口资源
IngressController
- 持续请求kubernetes API,实时感知后端 service、pod变化(traifik无需这步,其直接和K8S交互)
- 结合Ingress规则刷新负载均衡器的配置,实现服务发现
Volume
基于插件形式实现,扩展性强
- Volume:不能单独创建,非独立资源对象
- 单节点存储,基于Pod所在节点的本地目录,常用于临时数据存储或Pod内容器数据共享
- EmptyDir:空目录,限于Pod生命周期但超越容器(可指定磁盘或内存,可设定存储上限,类似于docker volume内部声明)
- HostPath:挂载宿主机已有的目录,独立于Pod存在(类似于docker volume外部声明)
- 跨节点存储storage provider
- Block Storage
- Distributed File System
- 单节点存储,基于Pod所在节点的本地目录,常用于临时数据存储或Pod内容器数据共享
- Persistent Volume:可单独创建,独立资源对象
- 通过Persistent Volume Claim来绑定卷和Pod,PV由Available状态转为Bound状态
- PV释放后转为Released状态,并进行相应回收策略
- Retain:保留现场,K8S什么也不做
- Delete:K8S删除PV及里面的数据
- Recycle:K8S删除PV里的数据,PV再次Available
- 创建形式
- 静态创建:手工创建PV池供PVC绑定
- 动态创建:基于Storage Class,存储系统根据PVC要求自动创建
- 存储驱动:可以使用主流的CephRBD或GlusterFS分布式存储方案,亦可使用方便简单的NFS(可以直接使用阿里云的NAS存储服务,支持NFS协议)方案
Minikube - 轻量级K8S架设方案
docker准备
- Docker Daemon
- Docker Machine
安装
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/
以下内容写入/init_minikube.sh
并赋予可执行权限
#!/bin/bash
export MINIKUBE_WANTUPDATENOTIFICATION=false
export MINIKUBE_WANTREPORTERRORPROMPT=false
export MINIKUBE_HOME=$HOME
export CHANGE_MINIKUBE_NONE_USER=true
export KUBECONFIG=$HOME/.kube/config
mkdir -p $HOME/.kube && touch $HOME/.kube/config
minikube start --vm-driver=none #将k8s集群通过none驱动模式直接装入宿主机
使用
sudo su - #none驱动模式安装minkube要求使用root账号去管理操作
/init_minikube.sh
minikube dashboard --url #默认在30000端口开放k8s管理界面
minikube service frontend --url #指定服务的地址
#插件管理
minikube addons list
minikube addons enable 插件名
安装排错
minikube logs
检查错误日志- 留意
gcr.io/google_containers/pause-amd64
等镜像是否成功下载
K8S集群管理
#管理命令(资源类型:nodes、pods、deployments、events、service、ing、all)
kubectl version
kubectl cluster-info #显示集群信息
kubectl get 资源类型 [-l label键=label值] [-n 名字空间 / --all-namespaces] #罗列工作节点
kubectl config view #查看配置
kubectl describe 资源类型 #资源详情
kubectl logs 资源名 #容器打印日志
kubectl label 资源类型 资源名 label键=label值 #打标签
#常用命令
kubectl get pod -o wide/yaml #检查pod所在节点
kubectl get services 服务名 -o yaml #检查服务详情
kubectl delete pod --grace-period=0 --force pod名 #立即强制删除pod
#容器执行命令
kubectl exec -ti Pod名 -- 命令
kubectl exec Pod名 -- 命令
#configmap管理
kubectl create configmap 配置名 --from-file=配置文件路径
kubectl get configmap 配置名 -o yaml
#创建deployment部署一个应用到Pod
kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email> #安装registry凭据
方法1:kubectl run 部署名 --image=镜像地址 --port=8080 --replicas=副本数 --labels="key=value"
方法2:kubectl create|apply -f deployment.yaml
kubectl get deployments
kubectl get pods
#更新应用
kubectl set image deployments/部署名 部署名=镜像地址
kubectl rollout status deployments/部署名 #查看更新状态
#回滚应用
kubectl rollout undo deployments/部署名
#应用伸缩
kubectl scale deployments/部署名 --replicas=副本数
#开放pod服务为service
kubectl expose deployment/部署名 --name=服务名 --type=NodePort|LoadBalancer--port 端口号
kubectl get services #可查看服务开放地址
#下线服务
kubectl delete service -l label键=label值
kubectl delete deployment -l label键=label值
#禁止非worker节点调度运行POD
kubectl taint node 节点名 node-role.kubernetes.io/节点名="":NoSchedule
健康检查
- 进程级别检查:检查Docker Daemon服务时候活跃
- 应用级别检查
- HTTP:状态码200 and 399为健康
- Container Exec:执行容器命令,退出码为0则健康
- TCP Socket:尝试套接字连接到容器内
Rancher
- V1版本支持K8S、Mesos、Swarm,V2转而全力支持唯一K8S
- Catalog:rancher构建的应用市场
- Cattle:rancher自身使用的编排调度框架
安装
防火墙开放端口
- SSH:22/tcp
- RancherServer:8443/tcp、8080/tcp
- K8S :6443(tcp ApiServer)、10250(tcp KubeletApi)、10251(tcp Schedule)、10252(tcp Control)、10255(tcp Control)、10256(tcp Kubeproxy)、30000/32767(tcp NodePort)
- VXLAN:4789/udp
- IPSec:500/udp、4500/udp
- Etcd:2379/tcp、2380/tcp
- Canal:80/tcp、443/tcp
- Flannel:8285/udp、8472/udp、2375/udp
开启IPV4路由转发(CentOS 7.4+不必此操作)
#/etc/sysctl.conf追加一行
net.ipv4.ip_forward = 1
Docker准备
- RancherServer及集群节点上支持最高Docker版本
v17.03-ce
sudo yum install -y --setopt=obsoletes=0 docker-ce-17.03.2.ce-1.el7.centos docker-ce-selinux-17.03.2.ce-1.el7.centos
HTTPS证书准备
docker run -it --rm -p 443:443 -p 80:80 --name certbot \
-v "/etc/letsencrypt:/etc/letsencrypt" \
-v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
certbot/certbot certonly -n -v --standalone --agree-tos [email protected] -d rancher.example.com
cd /etc/letsencrypt
sudo ln -s live/rancher.example.com/fullchain.pem cert.pem
sudo ln -s live/rancher.example.com/privkey.pem key.pem
节点机调整
- 自定义方式创建RKE集群对节点hostname有要求
# hostname要求符合如下正则 `'[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*'`
sudo hostnamectl set-hostname k8s-worker-1.cluster-a
sudo hostnamectl status
- 为了加速节点及拉取私有镜像库的速率, 需要在节点机上增加一条host解析镜像库的局域网ip
Compose编排服务
version: '2'
services:
Rancher:
image: rancher/server:preview
container_name: rancher
hostname: rancher
restart: always
ports:
- '8443:8443'
- '8080:8080'
volumes:
- /srv/rancher:/var/lib/rancher
- /etc/letsencrypt:/etc/rancher/ssl
entrypoint: rancher --http-listen-port=8080 --https-listen-port=8443
command: --acme-domain rancher.example.com
启动服务
docker pull rancher/server:preview
docker-compose up -d Rancher
docker logs -f rancher #跟进rancher初始化状态
配置
- 默认账号密码
admin:admin
- 登录系统并修改密码
创建集群
- custom模式、canal网络创建集群
- control、etcd节点要求至少1核2G内存(集群节点掉线可排查机器负载情况)
- 配置Registries私有镜像仓库
调试
####
#RancherServer调试
docker logs -f rancher
#K8sNode调试
journalctl -xf -u docker
docker logs kubelet