指令很全的K8s学习笔记(一)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
云解析 DNS,旗舰版 1个月
简介: 指令很全的K8s学习笔记(一)

常用指令

Kubectl命令行管理对象
类型 命令 描述
基础命令
create 通过文件名或标准输入创建资源。
expose 将一个资源公开为一个新的Kubernetes服务。
run
创建并运行一个特定的镜像,可能是副本。
创建一个deployment或job管理创建的容器。
set 配置应用资源。
修改现有应用程序资源。
get 显示一个或多个资源。
explain 文档参考资料。
edit 使用默认的编辑器编辑一个资源。
delete 通过文件名、标准输入、资源名称或标签选择器来删除资源。
部署命令
rollout 管理资源的发布。
rolling-update 执行指定复制控制的滚动更新。
scale 扩容或缩容Pod数量,Deployment、ReplicaSet、RC或Job。
autoscale 创建一个自动选择扩容或缩容并设置Pod数量。
集群管理命令
certificate 修改证书资源。
cluster-info 显示集群信息。
top 显示资源(CPU/Memory/Storage)使用。需要Heapster运行。
cordon 标记节点不可调度。
uncordon 标记节点可调度。
drain 维护期间排除节点。
taint
--------------------------------------
Kubectl命令行管理对象
类型 命令 描述
故障诊断和调试命令
describe 显示特定资源或资源组的详细信息。
logs 在pod或指定的资源中容器打印日志。如果pod只有一个容器,容器名称是可选的。
attach 附加到一个进程到一个已经运行的容器。
exec 执行命令到容器。
port-forward 转发一个或多个本地端口到一个pod。
proxy 为kubernetes API Server启动服务代理。
cp 拷贝文件或目录到容器中。
auth 检查授权。
高级命令
apply 通过文件名或标准输入对资源应用配置。
patch 使用补丁修改、更新资源的字段。
replace 通过文件名或标准输入替换一个资源。
convert 不同的API版本之间转换配置文件。YAML和JSON格式都接受。
设置命令
label 更新资源上的标签。
annotate 在一个或多个资源上更新注释。
completion 用于实现kubectl工具自动补全。
其他命令
api-versions 打印受支持的API版本。
config 修改kubeconfig文件(用于访问API,比如配置认证信息)。
help 所有命令帮助。
plugin 运行一个命令行插件。
version 打印客户端和服务版本信息
------------------------------------
Kubectl命令行管理对象
示例:
# 运行应用程序
kubectl run hello-world --replicas=3 --labels="app=example" --image=nginx:1.10 --port=80
# 显示有关Deployments信息
kubectl get deployments hello-world
kubectl describe deployments hello-world
# 显示有关ReplicaSet信息
kubectl get replicasets
kubectl describe replicasets
# 创建一个Service对象暴露Deployment(在88端口负载TCP流量)
kubectl expose deployment hello-world --port=88 --type=NodePort --target-port=80 --name=example-service
# 创建一个Service对象暴露Deployment(在4100端口负载UDP流量)
kubectl expose deployment hello-world --port=4100 --type=NodePort --protocol=udp --target-port=80 --
name=example-service
# 显示有关Service信息
kubectl describe services example-service
# 使用节点IP和节点端口访问应用程序
curl http://<public-node-ip>:<node-port>
#根据端口查询服务
netstat -anpt | grep : 端口号
#ingress查看
kubectl get svc -n ingress-ngnix
#获取configmap
kubuvtl get cm
#configmap详细信息
kubectl describe cm configmap名称
#修改configmap
kubectl edit configmap configmap名称
#阿里云时间同步服务器
ntpdate ntp1.aliyun.com
#获取pv
kubectl get pv
#获取pvc
kubectl get pvc
#获取指定pv的内容输出格式为yaml
kubectl get pv pv名称 -o yaml
#修改内容
kubectl edit pv pv名称
#通过 kubectl replace 命令完成对Node 状态的修改
[root@master node]# kubectl replace -f unschedule_node.yaml 
node/192.168.0.222 replaced
[root@master node]# kubectl get nodes
NAME            STATUS                     ROLES     AGE       VERSION
192.168.0.144   Ready                      <none>    25d       v1.11.6
192.168.0.148   Ready                      <none>    25d       v1.11.6
192.168.0.222   Ready,SchedulingDisabled   <none>    5d        v1.11.6
#查看Node的状态,可以观察到在Node的状态中增加了一项SchedulingDisabled,对于后续创建的Pod,系统将不会再向该Node进行调度。也可以不使用配置文件,直接使用 kubectl patch 命令完成:
kubectl patch node k8s-node-1 -p '{"spec": {"unschedulaable": true}}'
#需要注意的是,将某个Node脱离调度范围时,在其上运行的pod并不会自动停止,管理员需要手动停止在改Node是上运行的pod.
#同样,如果需要将某个node重新纳入集群调度范围,则将unschedulable 设置为false,再次执行 kubectl replace 或者kubectl  patch 命令就能恢复系统对改node的调度。
#第三种方法:
#使用kubectl cordon <node_name> 对某个Node 进行隔离调度操作
[root@master node]# kubectl cordon 192.168.0.148
node/192.168.0.148 cordoned
[root@master node]# kubectl get nodes
NAME            STATUS                     ROLES     AGE       VERSION
192.168.0.144   Ready                      <none>    25d       v1.11.6
192.168.0.148   Ready,SchedulingDisabled   <none>    25d       v1.11.6
192.168.0.222   Ready,SchedulingDisabled   <none>    5d        v1.11.6
#恢复调度操作:
[root@master node]# kubectl uncordon 192.168.0.222
node/192.168.0.222 uncordoned
[root@master node]# kubectl get nodes
NAME            STATUS    ROLES     AGE       VERSION
192.168.0.144   Ready     <none>    25d       v1.11.6
192.168.0.148   Ready     <none>    25d       v1.11.6
192.168.0.222   Ready     <none>    5d        v1.11.6
#创建命名空间
kubectl create namespace 名称
#获取命名空间
kubectl get namespace
#删除命名空间
kubectl delete namespace 名称
#获取目前API接口信息
kubectl   api-resources
#对运行时容器进行修改
kubectl patch pod rc-容器app名称-kpiqt -p
#对副本扩缩容
kubectl scale rc rc-容器app名称 —replicas=扩缩容数量
#pod对副本自动进行扩缩容
kubectl autoscale rc rc-容器app名称 --min=1 --max=4
kubectl常用命令:
kubectl cluster-info #查看集群信息
kubectl describe pod -n kube-system kube-flannel-ds-amd64-trpqq #查看pod的描述信息
kubectl get pods -n kube-system #查看指定命名空间的pod
kubectl create deployment NAME --image=image [--dry-run] [options] #创建deployment, dry-run为true就是测试不执行
kubectl create serviceaccount admin -o yaml --dry-run #针对所有可以用kubectl create 创建的资源,都可以加 -o yaml --dry-run ,用来导出yaml标准格式的文件。
kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP
#为deployment创建service, --name为service的名字, --port为暴露端口, --target-port为目标pod端口
dig -t A nginx.default.svc.cluster.local @10.96.0.10 #验证是否能正确解析service, @后边的ip为k8s的dns地址
kubectl describe svc nginx #查看名为nginx的这个service的详细信息
kubectl get pods --show-labels #查看pod的标签
kubectl scale deployment nginx-deploy --replicas=3 #扩容或缩容, --replicas为数量
wget -O - -q nginx-deploy
kubectl rollout undo deployment myapp-deploy --to-revision=1 #回滚到指定版本, 默认回滚到上一版本
kubectl explain pod #查看pod用法的详细信息(参数选项等)

kubectl指令使用

kubectl工具的使用
        #创建
        kubectl run nginx --replicas=3 --labels="app=nginx-example" --image=nginx:1.17.4 --port=80
        #查看
        kubectl get deploy
        kubectl get pods --show-labels
        kubectl get pods -l app=example
        kubectl get pods -o wide
        #发布
        kubectl expose deployment nginx --port=88 --type=NodePort --tartget-port=80 --name=nginx-service 
        kubectl describe service nginx-service
        #故障排查
        kubectl describe TYPE NAME_PREFIX
        kubectl logs nginx-xxx
        kubectl exec -it nginx-xxx bash
        #更新 
        kubectl set image deployment/nginx nginx=nginx:1.17.4 
        kubectl edit deployment/nginx
        #资源发布管理
        kubectl rollout status deployment/nginx
        kubectl rollout history deployment/nginx
        kubectl rollout history deployment/nginx --revision=3 kubectl scale deployment nginx --replicas=10
        #回滚 
        kubectl rollout undo deployment/nginx-deployment
        kubectl rollout undo deployment/nginx-deployment --to-revision=3
        #删除
        kubectl delete deploy/nginx
        kubectl delete svc/nginx-service
        #写yaml文件用到的api
        #定义配置时,指定最新稳定版API(当前为v1)
        kubectl api-versions

K8S创建的相关yaml文件

一、K8S-yaml的使用及命令

YAML配置文件管理对象
对象管理:
# 创建deployment资源
kubectl create -f nginx-deployment.yaml
# 查看deployment
kubectl get deploy
# 查看ReplicaSet
kubectl get rs
# 查看pods所有标签
kubectl get pods --show-labels
# 根据标签查看pods
kubectl get pods -l app=nginx
# 滚动更新镜像
kubectl set image deployment/nginx-deployment nginx=nginx:1.11
或者
kubectl edit deployment/nginx-deployment
或者
kubectl apply -f nginx-deployment.yaml
# 实时观察发布状态:
kubectl rollout status deployment/nginx-deployment
# 查看deployment历史修订版本
kubectl rollout history deployment/nginx-deployment
kubectl rollout history deployment/nginx-deployment --revision=3
# 回滚到以前版本
kubectl rollout undo deployment/nginx-deployment
kubectl rollout undo deployment/nginx-deployment --to-revision=3
# 扩容deployment的Pod副本数量
kubectl scale deployment nginx-deployment --replicas=10
# 设置启动扩容/缩容
kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80

二、POD

实例1:三种策略

apiVersion: v1
kind: Pod
metadata:
  name: pod-test
  labels:
     os: centos
spec:
  containers:
  - name: hello
    image: centos:7
    env:
    - name: Test
      value: "123456"
    command: ["bash","-c","while true;do date;sleep 1;done"]
  restartPolicy: OnFailure
支持三种策略:
Always:当容器终止退出后,总是重启容器,默认策略。
OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。
Never:当容器终止退出,从不重启容器。

实例2:数据持久化和共享

apiVersion: v1
kind: Pod
metadata:
  name: pod-test1
  labels:
     test: centos
spec:
  containers:
  # 第一个容器
  - name: hello-write
    image: centos:7
    command: ["bash","-c","for i in {1..1000};do echo $i >> /data/hello;sleep 1;done"]
  # 第二个容器
  - name: hello-read
    image: centos:7
    command: ["bash","-c","for i in {1..1000};do cat $i >> /data/hello;sleep 1;done"]
    volumeMounts:
      - name: data
        mountPath: /data
  # 数据卷
  volumes:
  - name: data
    hostPath:
      path: /data

实例3:pod的端口映射

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.10
    ports:
    - name: http
      containerPort: 80
      hostIP: 0.0.0.0
      hostPort: 80
      protocol: TCP
    - name: https
      containerPort: 443
      hostIP: 0.0.0.0
      hostPort: 443
      protocol: TCP

实例4

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.10
    ports:
    - containerPort: 80
    livenessProbe:
      httpGet:
        path: /index.html
        port: 80

详细解析

apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中  
kind: Pod #指定创建资源的角色/类型  
metadata: #资源的元数据/属性  
  name: web04-pod #资源的名字,在同一个namespace中必须唯一  
  labels: #设定资源的标签,详情请见http://blog.csdn.net/liyingke112/article/details/77482384
    k8s-app: apache  
    version: v1  
    kubernetes.io/cluster-service: "true"  
  annotations:            #自定义注解列表  
    - name: String        #自定义注解名字  
spec:#specification of the resource content 指定该资源的内容  
  restartPolicy: Always #表明该容器一直运行,默认k8s的策略,在此容器退出后,会立即创建一个相同的容器  
  nodeSelector:     #节点选择,先给主机打标签kubectl label nodes kube-node1 zone=node1  
    zone: node1  
  containers:  
  - name: web04-pod #容器的名字  
    image: web:apache #容器使用的镜像地址  
    imagePullPolicy: Never #三个选择Always、Never、IfNotPresent,每次启动时检查和更新(从registery)images的策略,
                           # Always,每次都检查
                           # Never,每次都不检查(不管本地是否有)
                           # IfNotPresent,如果本地有就不检查,如果没有就拉取
    command: ['sh'] #启动容器的运行命令,将覆盖容器中的Entrypoint,对应Dockefile中的ENTRYPOINT  
    args: ["$(str)"] #启动容器的命令参数,对应Dockerfile中CMD参数  
    env: #指定容器中的环境变量  
    - name: str #变量的名字  
      value: "/etc/run.sh" #变量的值  
    resources: #资源管理,请求请见http://blog.csdn.net/liyingke112/article/details/77452630
      requests: #容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行  
        cpu: 0.1 #CPU资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为0.001核(1m)
        memory: 32Mi #内存使用量  
      limits: #资源限制  
        cpu: 0.5  
        memory: 32Mi  
    ports:  
    - containerPort: 80 #容器开发对外的端口
      name: httpd  #名称
      protocol: TCP  
    livenessProbe: #pod内容器健康检查的设置,详情请见http://blog.csdn.net/liyingke112/article/details/77531584
      httpGet: #通过httpget检查健康,返回200-399之间,则认为容器正常  
        path: / #URI地址  
        port: 80  
        #host: 127.0.0.1 #主机地址  
        scheme: HTTP  
      initialDelaySeconds: 180 #表明第一次检测在容器启动后多长时间后开始  
      timeoutSeconds: 5 #检测的超时时间  
      periodSeconds: 15  #检查间隔时间  
      #也可以用这种方法  
      #exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常  
      #  command:  
      #    - cat  
      #    - /tmp/health  
      #也可以用这种方法  
      #tcpSocket: //通过tcpSocket检查健康   
      #  port: number   
    lifecycle: #生命周期管理  
      postStart: #容器运行之前运行的任务  
        exec:  
          command:  
            - 'sh'  
            - 'yum upgrade -y'  
      preStop: #容器关闭之前运行的任务  
        exec:  
          command: ['service httpd stop']  
    volumeMounts:  #详情请见http://blog.csdn.net/liyingke112/article/details/76577520
    - name: volume #挂载设备的名字,与volumes[*].name 需要对应    
      mountPath: /data #挂载到容器的某个路径下  
      readOnly: True  
  volumes: #定义一组挂载设备  
  - name: volume #定义一个挂载设备的名字  
    #meptyDir: {}  
    hostPath:  
      path: /opt #挂载设备类型为hostPath,路径为宿主机下的/opt,这里设备类型支持很多种

Pod管理-创建/查询/更新/删除

基本管理:
# 创建pod资源
kubectl create -f pod.yaml
# 查看pods
kubectl get pods pod-test
# 查看pod描述
kubectl describe pod pod-test
# 替换资源
kubectl replace -f pod.yaml -force
# 删除资源
kubectl delete pod pod-test
健康管理
提供Probe机制,有以下两种类型:
livenessProbe
如果检查失败,将杀死容器,然后根据Pod的重启策略来决定是否
重启。
readinessProbe
如果检查失败,Kubernetes会把Pod从服务代理的分发后端剔除。
Probe支持以下三种检查方法:
httpGet
发送HTTP请求,返回200-400范围状态码为成功。
exec
执行Shell命令返回状态码是0为成功。
tcpSocket
发起TCP Socket建立成功。


三、Deployment

简单例子

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.10
        ports:
        - containerPort: 80

详细解析

apiVersion: extensions/v1beta1
kind: Deployment
metadata: <Object>
spec: <Object>
  minReadySeconds: <integer> #设置pod准备就绪的最小秒数
  paused: <boolean> #表示部署已暂停并且deploy控制器不会处理该部署
  progressDeadlineSeconds: <integer>
  strategy: <Object> #将现有pod替换为新pod的部署策略
    rollingUpdate: <Object> #滚动更新配置参数,仅当类型为RollingUpdate
      maxSurge: <string> #滚动更新过程产生的最大pod数量,可以是个数,也可以是百分比
      maxUnavailable: <string> #
    type: <string> #部署类型,Recreate,RollingUpdate
  replicas: <integer> #pods的副本数量
  selector: <Object> #pod标签选择器,匹配pod标签,默认使用pods的标签
    matchLabels: <map[string]string> 
      key1: value1
      key2: value2
    matchExpressions: <[]Object>
      operator: <string> -required- #设定标签键与一组值的关系,In, NotIn, Exists and DoesNotExist
      key: <string> -required-
      values: <[]string>   
  revisionHistoryLimit: <integer> #设置保留的历史版本个数,默认是10
  rollbackTo: <Object> 
    revision: <integer> #设置回滚的版本,设置为0则回滚到上一个版本
  template: <Object> -required-
    metadata:
    spec:
      containers: <[]Object> #容器配置
      - name: <string> -required- #容器名、DNS_LABEL
        image: <string> #镜像
        imagePullPolicy: <string> #镜像拉取策略,Always、Never、IfNotPresent
        ports: <[]Object>
        - name: #定义端口名
          containerPort: #容器暴露的端口
          protocol: TCP #或UDP
        volumeMounts: <[]Object>
        - name: <string> -required- #设置卷名称
          mountPath: <string> -required- #设置需要挂载容器内的路径
          readOnly: <boolean> #设置是否只读
        livenessProbe: <Object> #就绪探测
          exec: 
            command: <[]string>
          httpGet:
            port: <string> -required-
            path: <string>
            host: <string>
            httpHeaders: <[]Object>
              name: <string> -required-
              value: <string> -required-
            scheme: <string> 
          initialDelaySeconds: <integer> #设置多少秒后开始探测
          failureThreshold: <integer> #设置连续探测多少次失败后,标记为失败,默认三次
          successThreshold: <integer> #设置失败后探测的最小连续成功次数,默认为1
          timeoutSeconds: <integer> #设置探测超时的秒数,默认1s
          periodSeconds: <integer> #设置执行探测的频率(以秒为单位),默认1s
          tcpSocket: <Object> #TCPSocket指定涉及TCP端口的操作
            port: <string> -required- #容器暴露的端口
            host: <string> #默认pod的IP
        readinessProbe: <Object> #同livenessProbe
        resources: <Object> #资源配置
          requests: <map[string]string> #最小资源配置
            memory: "1024Mi"
            cpu: "500m" #500m代表0.5CPU
          limits: <map[string]string> #最大资源配置
            memory:
            cpu:         
      volumes: <[]Object> #数据卷配置
      - name: <string> -required- #设置卷名称,与volumeMounts名称对应
        hostPath: <Object> #设置挂载宿主机路径
          path: <string> -required- 
          type: <string> #类型:DirectoryOrCreate、Directory、FileOrCreate、File、Socket、CharDevice、BlockDevice
      - name: nfs
        nfs: <Object> #设置NFS服务器
          server: <string> -required- #设置NFS服务器地址
          path: <string> -required- #设置NFS服务器路径
          readOnly: <boolean> #设置是否只读
      - name: configmap
        configMap: 
          name: <string> #configmap名称
          defaultMode: <integer> #权限设置0~0777,默认0664
          optional: <boolean> #指定是否必须定义configmap或其keys
          items: <[]Object>
          - key: <string> -required-
            path: <string> -required-
            mode: <integer>
      restartPolicy: <string> #重启策略,Always、OnFailure、Never
      nodeName: <string>
      nodeSelector: <map[string]string>
      imagePullSecrets: <[]Object>
      hostname: <string>
      hostPID: <boolean>
status: <Object>


四、Service

服务类型

服务类型:
ClusterIP
分配一个内部集群IP地址,只能在集群内部访问(同Namespace内的Pod),默认ServiceType。
 NodePort
分配一个内部集群IP地址,并在每个节点上启用一个端口来暴露服务,可以在集群外部访问。
访问地址:<NodeIP>:<NodePort>
LoadBalancer
分配一个内部集群IP地址,并在每个节点上启用一个端口来暴露服务。
除此之外,Kubernetes会请求底层云平台上的负载均衡器,将每个Node([NodeIP]:[NodePort])作为后端添加进去。
 ExternalName
通过CNAME将Service与externalName的值映射。要求kube-dns的版本为v1.7+。

实例1

apiVersion: v1
kind: Service
metadata:
  labels:
    run: nginx
  name: nginx
  namespace: default
spec:
  ports:
  - port: 88
    targetPort: 80
  selector:
    app: nginx

实例2:指定ip

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: nginx
  ports:
  - name: http
    protocol: TCP
    port: 888
    targetPort: 80
#  可以指定ip
  clusterIP: "10.10.10.123"
#  - name: https
#    protocol: TCP
#    port: 443
#    targetPort: 9377

实例3:发布服务

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx
spec:
  selector:
    app: nginx
  ports:
  - name: http
    port: 8080
    targetPort: 80
    nodePort: 30001
  type: NodePort

k8s是什么?

Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。


通过Kubernetes你可以:


快速部署应用

快速扩展应用

无缝对接新的应用功能

节省资源,优化硬件资源的使用

我们的目标是促进完善组件和工具的生态系统,以减轻应用程序在公有云或私有云中运行的负担。


Kubernetes 特点

可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)

可扩展: 模块化, 插件化, 可挂载, 可组合

自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展

Kubernetes是Google 2014年创建管理的,是Google 10多年大规模容器管理技术Borg的开源版本。


Kubernetes 特点

可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)

可扩展: 模块化, 插件化, 可挂载, 可组合

自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展

Kubernetes是Google 2014年创建管理的,是Google 10多年大规模容器管理技术Borg的开源版本。


Why containers?

为什么要使用容器?通过以下两个图对比:


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bkWcJzyz-1626275743487)(https://d33wubrfki0l68.cloudfront.net/e7b766e0175f30ae37f7e0e349b87cfe2034a1ae/3e391/images/docs/why_containers.svg#height=150&id=UvIIQ&originHeight=150&originWidth=196&originalType=binary&status=done&style=none&width=196)]


传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。


新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。


容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在build或release  的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚机轻量、更“透明”,这更便于监控和管理。最后,


容器优势总结:


**快速创建/部署应用:**与VM虚拟机相比,容器镜像的创建更加容易。

**持续开发、集成和部署:**提供可靠且频繁的容器镜像构建/部署,并使用快速和简单的回滚(由于镜像不可变性)。

**开发和运行相分离:**在build或者release阶段创建容器镜像,使得应用和基础设施解耦。

**开发,测试和生产环境一致性:**在本地或外网(生产环境)运行的一致性。

**云平台或其他操作系统:**可以在 Ubuntu、RHEL、 CoreOS、on-prem、Google Container Engine或其它任何环境中运行。

**Loosely coupled,分布式,弹性,微服务化:**应用程序分为更小的、独立的部件,可以动态部署和管理。

资源隔离

**资源利用:**更高效


使用Kubernetes能做什么?

可以在物理或虚拟机的Kubernetes集群上运行容器化应用,Kubernetes能提供一个以“容器为中心的基础架构”,满足在生产环境中运行应用的一些常见需求,如:


多个进程(作为容器运行)协同工作。(Pod)

存储系统挂载

Distributing secrets

应用健康检测

应用实例的复制

Pod自动伸缩/扩展

Naming and discovering

负载均衡

滚动更新

资源监控

日志访问

调试应用程序

提供认证和授权


Kubernetes是什么意思?K8S?

Kubernetes的名字来自希腊语,意思是“舵手” 或 “领航员”。_K8s_是将8个字母“ubernete”替换为“8”的缩写。


Master 组件

Master组件提供集群的管理控制中心。


Master组件可以在集群中任何节点上运行。但是为了简单起见,通常在一台VM/机器上启动所有Master组件,并且不会在此VM/机器上运行用户容器。请参考 构建高可用群集以来构建multi-master-VM。

kube-apiserver

kube-apiserver用于暴露Kubernetes API。任何的资源请求/调用操作都是通过kube-apiserver提供的接口进行。请参阅构建高可用群集。

ETCD

etcd是Kubernetes提供默认的存储系统,保存所有集群数据,使用时需要为etcd数据提供备份计划。

kube-controller-manager

kube-controller-manager运行管理控制器,它们是集群中处理常规任务的后台线程。逻辑上,每个控制器是一个单独的进程,但为了降低复杂性,它们都被编译成单个二进制文件,并在单个进程中运行。


这些控制器包括:

节点(Node)控制器。

副本(Replication)控制器:负责维护系统中每个副本中的pod。

端点(Endpoints)控制器:填充Endpoints对象(即连接Services&Pods)。

Service Account

和Token控制器:为新的

Namespace

创建默认帐户访问API Token。

cloud-controller-manager

云控制器管理器负责与底层云提供商的平台交互。云控制器管理器是Kubernetes版本1.6中引入的,目前还是Alpha的功能。

云控制器管理器仅运行云提供商特定的(controller loops)控制器循环。可以通过将--cloud-provider flag设置为external启动kube-controller-manager ,来禁用控制器循环。

cloud-controller-manager 具体功能:

节点(Node)控制器

路由(Route)控制器

Service控制器

卷(Volume)控制器

kube-scheduler

kube-scheduler 监视新创建没有分配到Node的Pod,为Pod选择一个Node。


插件 addons

插件(addon)是实现集群pod和Services功能的 。Pod由Deployments,ReplicationController等进行管理。Namespace 插件对象是在kube-system Namespace中创建。

DNS

虽然不严格要求使用插件,但Kubernetes集群都应该具有集群 DNS。

群集 DNS是一个DNS服务器,能够为 Kubernetes services提供 DNS记录。

由Kubernetes启动的容器自动将这个DNS服务器包含在他们的DNS searches中。

了解更多详情


用户界面

kube-ui提供集群状态基础信息查看。更多详细信息,请参阅使用HTTP代理访问Kubernetes API

容器资源监测

容器资源监控提供一个UI浏览监控数据。

Cluster-level Logging

Cluster-level logging,负责保存容器日志,搜索/查看日志。

节点(Node)组件

节点组件运行在Node,提供Kubernetes运行时环境,以及维护Pod。

kubelet

kubelet是主要的节点代理,它会监视已分配给节点的pod,具体功能:

安装Pod所需的volume。

下载Pod的Secrets。

Pod中运行的 docker(或experimentally,rkt)容器。

定期执行容器健康检查。

Reports the status of the pod back to the rest of the system, by creating a mirror pod if necessary.

Reports the status of the node back to the rest of the system.

kube-proxy

kube-proxy通过在主机上维护网络规则并执行连接转发来实现Kubernetes服务抽象。

docker

docker用于运行容器。

RKT

rkt运行容器,作为docker工具的替代方案。

supervisord

supervisord是一个轻量级的监控系统,用于保障kubelet和docker运行。

fluentd

fluentd是一个守护进程,可提供cluster-level logging.。


一、Pod

指令

#创建pod
  kubectl create -f pod配置文件
#运行pod
  kubectl apply -f pod.yaml
#获取pod信息
  describe pod 镜像id
  kubectl get pod
  kubectl log 镜像的ID -c 容器名称
#删除pod
  kubectl delete pod podID
#pod详细信息
  kubectl get pod -o wide

资源清单格式

apiVersion: group/apiversion # 如果没有给定group 名称,那么默认为 core,可以使用 kubectl api- versions # 获取当前 k8s 版本上所有的 apiVersion 版本信息( 每个版本可能不同 ) 
kind: #资源类别 
metadata: #资源元数据 
  name 
  namespace 
  lables
  annotations # 主要目的是方便用户阅读查找 
spec: # 期望的状态(disired state) 
  status: # 当前状态,本字段有 Kubernetes 自身维护,用户不能去定义

资源清单的常用命令

[root@k8s-master01 ~]# kubectl api-versions
[root@k8s-master01 ~]# kubectl explain pod
[root@k8s-master01 ~]# kubectl explain Ingress
[root@k8s-master01 ~]# kubectl explain pod

创建简单pod

apiVersion: v1
kind: Pod
metadata: 
  name: myapp
  labels:
    app: myapp
    version: v1
spec:
  containers: 
  - name: app
    images: 镜像名:v1
    - name: test
      images: 镜像名:v1

pod生命周期:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iBEUZibC-1626275743489)(images%5Cpod%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.png#id=J7m1o&originalType=binary&status=done&style=none)]

  当cri在初始化之后,会加载一个pause基础容器,这个是对pod中的所有其他容器服务的,包括数据卷,网络等等,之后会初始化容器Init C,这个容器初始化动作为串行执行,正常退出码为0,不为零会根据重启策略其判断执行,之后执行成功会消亡。加载成功之后进入Main C主容器的运行,在运行起始的时候可以执行一些命令或者脚本,结束的时候也可以运行一些命令和脚本,在运行开始多少秒之后进行readness探测,在readness没探测成功之前pod的状态不能变为running状态;在运行期间,还有liveness参与,liveness主要是探测主容器状态,如果主容器不可用或者异常,执行重启或者删除等操作,根据重启策略来操作。

Init 容器

init模板

apiVersion: v1 
kind: Pod 
metadata: 
  name: myapp-pod 
  labels: 
    app: myapp
spec:
  containers:
  - name: myapp-container 
    image: busybox
    command: ['sh', '-c', 'echo The app is running! && sleep 3600'] 
  initContainers:
  - name: init-myservice 
    image: busybox
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
  - name: init-mydb 
    image: busybox
    command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
kind: Service 
apiVersion: v1 
metadata: 
  name: myservice 
  spec: 
    ports: 
      - protocol: TCP 
        port: 80 
        targetPort: 9376 
--- 
kind: Service 
apiVersion: v1 
metadata: 
  name: mydb 
spec: 
  ports: 
    - protocol: TCP 
      port: 80 
      targetPort: 9377

探针检测

检测探针 - 就绪检测

readinessProbe-httpget

apiVersion: v1 
kind: Pod 
metadata: 
  name: readiness-httpget-pod 
  namespace: default 
spec: 
  containers: 
  - name: readiness-httpget-container 
    image: wangyanglinux/myapp:v1 
    imagePullPolicy: IfNotPresent 
    readinessProbe: 
      httpGet: 
        port: 80 
        path: /index1.html 
        initialDelaySeconds: 1 
        periodSeconds: 3

检测探针 - 存活检测

livenessProbe-exec
apiVersion: v1 
kind: Pod 
metadata: 
  name: liveness-exec-pod 
  namespace: default 
spec: 
  containers: 
  - name: liveness-exec-container 
    image: hub.atguigu.com/library/busybox 
    imagePullPolicy: IfNotPresent 
    command: ["/bin/sh","-c","touch /tmp/live ; sleep 60; rm -rf /tmp/live; sleep 3600"]
    livenessProbe: 
      exec: command: ["test","-e","/tmp/live"] 
      initialDelaySeconds: 1 
      periodSeconds: 3
livenessProbe-httpget
apiVersion: v1 
kind: Pod 
metadata: 
  name: liveness-httpget-pod
  namespace: default 
spec: 
  containers: 
  - name: liveness-httpget-container 
    image: hub.atguigu.com/library/myapp:v1 
    imagePullPolicy: IfNotPresent 
    ports: 
    - name: http 
      containerPort: 80 
    livenessProbe: 
      httpGet: 
        port: http 
        path: /index.html 
        initialDelaySeconds: 1 
        periodSeconds: 3 
        timeoutSeconds: 10
livenessProbe-tcp
apiVersion: v1 
kind: Pod 
metadata: 
  name: probe-tcp 
spec: 
  containers: 
  - name: nginx 
    image: hub.atguigu.com/library/myapp:v1 
    livenessProbe: 
      initialDelaySeconds: 5 
      timeoutSeconds: 1 
      tcpSocket: 
        port: 80

启动、退出动作

apiVersion: v1 
kind: Pod 
metadata: 
  name: lifecycle-demo 
spec: 
  containers: 
  - name: lifecycle-demo-container 
    image: nginx 
    lifecycle: 
      postStart: 
        exec: 
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"] 
      preStop: 
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the poststop handler > /usr/share/message"]


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
6月前
|
Kubernetes Docker 容器
Kubernetes学习笔记-Part.06 Docker安装
Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退
66 1
|
3月前
|
Prometheus Kubernetes 网络协议
k8s学习笔记之CoreDNS
k8s学习笔记之CoreDNS
|
3月前
|
存储 Kubernetes 数据安全/隐私保护
k8s学习笔记之ConfigMap和Secret
k8s学习笔记之ConfigMap和Secret
|
3月前
|
Kubernetes jenkins 持续交付
jenkins学习笔记之二十一:k8s部署jenkins及动态slave
jenkins学习笔记之二十一:k8s部署jenkins及动态slave
|
3月前
|
存储 运维 Kubernetes
k8s学习笔记之StorageClass+NFS
k8s学习笔记之StorageClass+NFS
|
6月前
|
Kubernetes 调度 Docker
Ubantu docker学习笔记(十一)k8s基本操作
Ubantu docker学习笔记(十一)k8s基本操作
|
6月前
|
Kubernetes Linux Docker
Kubernetes学习笔记-Part.09 K8s集群构建
Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退
803 2
Kubernetes学习笔记-Part.09 K8s集群构建
|
6月前
|
Kubernetes Docker 容器
Kubernetes学习笔记-Part.08 安装k8s环境
Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退
102 2
|
6月前
|
存储 Kubernetes Cloud Native
Kubernetes学习笔记-Part.07 Harbor搭建
Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退
97 0
Kubernetes学习笔记-Part.07 Harbor搭建
|
6月前
|
Kubernetes Docker 容器
Kubernetes学习笔记-Part.10 容器回退
Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退
104 0