Kubernetes入门操作


简单的描述kubernets是干嘛的,当我们使用Docker容器集群,例如:10个订单服务,5个用户服务,5个钱包服务,一共二十个容器在宿主机上运行。当我们10个订单服务都映射主机8080端口时,可知主机端口是没有负载均衡的。我们必须通过外部负载均衡来分发到各个容器服务。另外,容器负载量太大挂掉了,我们需要手动维护重启容器,或者做集群扩容。还有版本迭代、回滚。容器的编排、网格化这就是Kubernetes。

为什么要使用kubernetes:

  1. 自动化容器部署与复制
    这里的自动化不是像Jenkins工具一样的部署,这里的自动化举个例子就像:原先使用docker部署,我们每一个容器在启动时都需要docker run一下,如果我要部署一百个容器,那么我要run一百下(或者写个脚本run一百下),k8s的自动化就类似于他帮我们写了个脚本run了一百个容器。
  2. 随时扩展或收缩容器规模
    k8s的收缩容可以根据容器的处理量,自定义配置进行扩容,例如:一个容器的处理量达到了峰值,或者一百个容器达到了峰值。k8s可以依据配置自动帮我们再创建一百个容器来进行处理分流。
  3. 组织容器成组,提供容器间的负载均衡
    k8s的负载均衡名词叫做Service,在k8s中当我们创建了一个容器服务(POD),会发现这个容器是不能被访问的。想要让外界请求,还需要apply一个service,这个service有几种访问策略:
访问模式 描述
ClusterIP 集群内部容器访问:会生成一个虚拟IP,与POD不在一个网段。
NodePort 主机端口映射:会在宿主机上映射一个端口,供外部应用访问模式。
Headless CluserIP 无头模式,即无IP。
LoadBalancer 使用外部负载均衡(自己搭建nginx等)
  1. 快速更新及回滚容器版本
    回滚操作:k8s对我们每一次发布的版本都有版本记录,当我们需要回滚时候,只需要一条命令,即可回滚到指定版本。
    滚动更新:k8s默认更新模式为滚动更新,即为当更新版本的容器启动成功后,才停止旧版本容器,滚动更新即不中断更新,但是仍然存在请求中断的情况。
  2. 提供弹性伸缩,如果某个容器失效就进行替换
    k8s在检查到某一个POD(容器)不健康时,会自动创建一个新的容器,并且杀掉旧容器。

kubernetes 操作(kubectl)

如何快速创建一个Deployment(快速部署一个服务)
需要准备好自定义的YAML文件

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: extensions/v1beta2
# 指定apply模式
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "0"
    description: 描述
  labels:
    k8s-app: [APP_NAME]
  # 部署名称 [APP_NAME]
  name: [APP_NAME]
  # 指定容器所在命名空间
  namespace: [NAMESPACE]
spec:
  progressDeadlineSeconds: 600
  # 副本数量
  replicas: 1
  # 修正历史版本量
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: [APP_NAME]
      qcloud-app: [APP_NAME]
  # 更新策略
  strategy:
    # 滚动更新
    rollingUpdate:
      # 最大涌量
      maxSurge: 1
      # 最大不可用
      maxUnavailable: 0
    # 更新类型:滚动更新
    type: RollingUpdate
  template:
    metadata:
      labels:
        k8s-app: [APP_NAME]
    spec:
      containers:
      # 设置容器环境变量
      - env:
        - name: ENV_NAME
          value: /usr/local/xxx/bin
        image: [镜像地址]
        # 镜像拉取策略:本地没有则去仓库拉
        imagePullPolicy: IfNotPresent
        # pod Name
        name: [APP_NAME]
        # 限制CPU核数和内存
        #resources:
          #limits:
            #cpu: "2"
            #memory: 4Gi
          #requests:
            #cpu: 250m
            #memory: 1Gi
        securityContext:
          privileged: false
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        # 容器挂载数据卷(若不需要挂载则删掉volumes)
        volumeMounts:
        - mountPath: /var/run
          name: docker-sock
      dnsPolicy: ClusterFirst
      imagePullSecrets:
      - name: qcloudregistrykey
      - name: tencenthubkey
      # 重启策略:总是
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      # 宿主机挂载数据卷(若不需要挂载则删掉volumes)
      volumes:
      - hostPath:
          path: /var/run
          type: DirectoryOrCreate
        name: docker-sock
执行以下命令应用部署:
kubectl apply -f xxx.yml
执行完成后,查看自己的部署结果
kubectl get deploy
get deploy 展示了Deployment列表,部署的POD查看命令
kubectl get pod
get pod列出k8s中所有的POD,如何进入进入容器:
kubectl exec -it [POD名称] /bin/bash
进入容器之后就可以操作你的容器了,如何删除一个POD呢,又如何删除一个Deploy。
# 删除deploy
kubectl delete deploy [Deployment名称]
# 删除pod
kubectl delete pod [POD名称]
查看POD日志
# 查看所有日志
kubectl logs [POD名称]
# 查看五分钟以内的日志
kubeclt logs --since 5m [POD名称]
# 过滤日志
kubectl logs [POD名称] | grep '[过滤字符串]'
Deployment 镜像更新
kubectl set image deploy [deploy名称] [容器名称]=[镜像名称]
Deployment 以及 Service 的 yaml 编辑,通过编辑 yaml 可将最新配置应用到每个POD上
# Deployment
kubectl edit deploy [deploy名称]
# Service
kubectl edit service [service名称]
回滚操作
# 查看一个deploy的所有历史版本
kubectl rollout history deploy [deploy名称]
# 将deploy回滚到上一个版本
kubectl rollout undo deploy [deploy名称]
# 回滚到指定版本,[version]为所有历史版本的版本号
kubectl rollout undo deploy [deploy名称] --to-revision=[version]
查看 Deploy 的状态
kubectl rollout status deploy [deploy名称]

如何快速创建一个Service
需要准备好自定义的YAML文件

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Service
metadata:
  annotations:
    description: [Service 创建备注]
  name: [Service名称]
  namespace: [命名空间]
spec:
  ports:
  # 端口配置
  - name: 26001-26001-tcp
    port: 26001
    protocol: TCP
    targetPort: 26001
  # 代理配置(指定deploy服务,创建对于此服务的负载均衡)
  selector:
    k8s-app: [deploy名称]
  sessionAffinity: None
  # 服务类型:集群内访问
  type: ClusterIP
执行应用
kubectl apply -f xxx.yml
创建一个仅集群内访问的Service
kubectl create service clusterip [service名称] --tcp=[service端口]:[容器端口]
创建一个主机端口访问的Service
kubectl create service nodeport [service名称] --tcp=[service端口]:[容器端口]
删除Service
kubectl delete service [Service名称]

整体部署流程为:

  1. 使用Docker构建镜像
  2. 将镜像上传至镜像仓库
  3. 编辑Deploy的yaml文件
  4. 执行apply应用此部署
  5. 编辑Service的yaml文件
  6. 执行apply应用此服务
  7. 通过Service访问POD

你可能感兴趣的:(kubernetes,docker)