Kubernetes笔记

当前最流行的开源容器集群调度方案,实现自动化部署,扩容,维护等功能

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
  • 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

猜你喜欢

转载自my.oschina.net/u/2400083/blog/1805285