- Kubernetes集群搭建
- kubectl 常用命令总结
- kubernetes核心
Kubernetes(简称K8s)是谷歌基于GO语言开源的容器自动化管理工具、持续部署工具。
集群搭建
- 一键搭建集群: https://github.com/easzlab/kubeasz
- 手把手一步一步手动搭建集群:https://github.com/opsnull/follow-me-install-kubernetes-cluster
kubectl get cs # 查看集群状态 kubectl get nodes # 查看集群节点信息 kubectl get ns # 查看集群命名空间 kubectl get po -n kube-system # 查看指定命名空间的Pod kubectl get svc -n kube-system # 查看指定命名空间的服务 kubectl get podkubernetes核心-o wide # 查看Pod详细信息 kubectl get pod -o yaml # 以yaml格式查看Pod详细信息 kubectl logs # 查看pod日志 kubectl get pods # 查看资源对象,查看所有Pod列表 kubectl get rc,service # 查看资源对象,查看rc和service列表 kubectl get po,svc,ep --show-labels # 查看pod,svc,ep能及标签信息 kubectl get all --all-namespaces # 查看所有的命名空间 kubectl describe nodes # 显示Node的详细信息 kubectl describe po # 显示Pod的详细信息 kubectl describe svc # 显示Service的详细信息 kubectl scale deployment nginx --replicas 5 # 扩容 kubectl scale deployment nginx --replicas 3 # 缩容 kubectl scale rc nginx --replicas 5 # 扩容 kubectl scale rc nginx --replicas 3 # 缩容 kubectl edit rc nginx # 编辑修改RC kubectl label po k1=v1 #为pod设置标签 kubectl label po k1=v2 --overwrite #修改pod的标签 kubectl label node ip k1=v1 #为node设置标签 kubectl delete po --all #删除当前命名空间中所有pod #删除一个系统Service kubernetes,它被删除后会立即被自动重建 kubectl delete all --all #删除 rc, 但不级联删除 pod, 使 pod 处于脱管状态 kubectl delete rc nginx --cascade=false kubectl delete rs nginx --cascade=false
- Pod
Pod是用来封装Docker容器的对象,它具有自己的虚拟环境(端口, 环境变量等),一个Pod可以封装多个Docker容器.
把pod部署到指定的节点服务器
cat <kubia-gpu.yml apiVersion: v1 kind: Pod metadata: name: kubia-gpu # pod名 spec: nodeSelector: # 节点选择器,把pod部署到匹配的节点 gpu: "true" # 通过标签 gpu=true 来选择匹配的节点 containers: # 容器配置 - image: luksa/kubia # 镜像 name: kubia # 容器名 imagePullPolicy: Never EOF k create -f kubia-gpu.yml # 使用部署文件创建资源
- 控制器
- RC(ReplicationController) 是用来自动控制Pod部署的工具,它可以自动启停Pod,指定Pod副本的数量对Pod进行自动伸缩,当一个pod宕机,RC可以自动关闭pod,并启动一个新的pod替代它
下面是一个RC的部署文件,设置启动三个kubia容器:
cat <kubia-rc.yml apiVersion: v1 kind: ReplicationController # 资源类型 metadata: name: kubia # 为RC命名 spec: replicas: 3 # pod副本的数量 selector: # 选择器,用来选择RC管理的pod app: kubia # 选择标签'app=kubia'的pod,由当前RC进行管理 template: # pod模板,用来创建新的pod metadata: labels: app: kubia # 指定pod的标签 spec: containers: # 容器配置 - name: kubia # 容器名 image: luksa/kubia # 镜像 imagePullPolicy: Never ports: - containerPort: 8080 # 容器暴露的端口 EOF k create -f kubia-rc.yml # 使用部署文件创建资源
2. ReplicaSet 被设计用来替代 ReplicationController,它提供了更丰富的pod选择功能
使用更强大的标签选择器
cat <kubia-replicaset.yml apiVersion: apps/v1 kind: ReplicaSet metadata: name: kubia spec: replicas: 4 selector: matchexpressions: # 表达式匹配选择器 - key: app # label 名是 app operator: In # in 运算符 values: # label 值列表 - kubia - foo template: metadata: labels: app: kubia spec: containers: - name: kubia image: luksa/kubia imagePullPolicy: Never EOF k create -f kubia-replicaset.yml # 使用部署文件创建资源
可使用的运算符:
In: label与其中一个值匹配
NotIn: label与任何一个值都不匹配
Exists: 包含指定label名称(值任意)
DoesNotExists: 不包含指定的label
- DaemonSet 不指定pod数量,它会在每个节点上(包括master)部署一个pod,例如资源监控,kube-proxy等
cat <ssd-monitor-daemonset.yml apiVersion: apps/v1 kind: DaemonSet # 资源类型 metadata: name: ssd-monitor # DS资源命名 spec: selector: matchLabels: # 标签匹配器 app: ssd-monitor # 匹配的标签 template: metadata: labels: app: ssd-monitor # 创建pod时,添加标签 spec: containers: # 容器配置 - name: main # 容器命名 image: luksa/ssd-monitor # 镜像 imagePullPolicy: Never EOF k create -f ssd-monitor-daemonset.yml
也可以在所有选定的节点上部署pod,通过节点的label来选择节点
cat <ssd-monitor-daemonset.yml apiVersion: apps/v1 kind: DaemonSet metadata: name: ssd-monitor spec: selector: matchLabels: app: ssd-monitor template: metadata: labels: app: ssd-monitor spec: nodeSelector: # 节点选择器 disk: ssd # 选择的节点上具有标签: 'disk=ssd' containers: - name: main image: luksa/ssd-monitor imagePullPolicy: Never EOF k create -f ssd-monitor-daemonset.yml
- Job 用来运行单个任务,任务结束后自动退出,pod不再重启
共完成5个pod,并每次可以同时启动两个pod
cat <exporter.yml apiVersion: batch/v1 # Job资源在batch/v1版本中提供 kind: Job # 资源类型 metadata: name: batch-job # 资源命名 spec: completions: 5 # 共完成5个 parallelism: 2 # 可以有两个pod同时执行 template: metadata: labels: app: batch-job # pod容器标签 spec: restartPolicy: onFailure # 任务失败时重启 containers: - name: main # 容器名 image: luksa/batch-job # 镜像 imagePullPolicy: Never EOF k create -f multi-completion-parallel-batch-job.yml
- Cronjob 定时和重复执行的任务
cron时间表格式:
"分钟 小时 每月的第几天 月 星期几"
cat <cronjob.yml apiVersion: batch/v1beta1 # api版本 kind: CronJob # 资源类型 metadata: name: batch-job-every-fifteen-minutes spec: # 0,15,30,45 - 分钟 # 第一个* - 每个小时 # 第二个* - 每月的每一天 # 第三个* - 每月 # 第四个* - 每一周中的每一天 schedule: "0,15,30,45 * * * *" jobTemplate: spec: template: metadata: labels: app: periodic-batch-job spec: restartPolicy: onFailure containers: - name: main image: luksa/batch-job imagePullPolicy: Never EOF k create -f cronjob.yml
到0,15,30,45分钟时,会创建一个pod
- Service
Service 用来对外暴露pod访问,在所有节点服务器上,暴露了20916端口,通过此端口,可以访问指定pod的8080端口(对多个pod提供一个不变的访问地址)
在每个节点(包括master),都开放一个相同的端口,可以通过任意节点的端口来访问Service
cat <kubia-svc-nodeport.yml apiVersion: v1 kind: Service metadata: name: kubia-nodeport spec: type: NodePort # 在每个节点上开放访问端口 ports: - port: 80 # 集群内部访问该服务的端口 targetPort: 8080 # 容器的端口 nodePort: 30123 # 外部访问端口 selector: app: kubia # 通过标签,选择名为kubia的所有pod EOF k create -f kubia-svc-nodeport.yml
endpoint是在Service和pod之间的一种资源,一个endpoint资源包含一组pod的地址列表
访问Service,Service会在多个pod中轮训发送请求
回话亲和性:来自同一个客户端的请求,总是发给同一个pod
cat <kubia-svc-clientip.yml apiVersion: v1 kind: Service metadata: name: kubia-clientip spec: sessionAffinity: ClientIP # 回话亲和性使用ClientIP ports: - port: 80 targetPort: 8080 selector: app: kubia EOF k create -f kubia-svc-clientip.yml



