部署

关键字说明

  • Pod是最小的,管理,创建,计划的最小单元。pod:由 pause, container1, constainer2... 组成
  • deployment控制器管理的是ReplicaSet,而不是pod。保证Pod的数量和健康。
  • service:service是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略,一般把service称为微服务
  • kube-proxy:k8s群集中的每个节点都运行一个kube-proxy的组件,kube-proxy其实是一个代理层负责实现service. 即:OverLay 网络 相关链接

配置说明

  • metadata: 标记当前服务的名称和标签
  • spec 中的 selector 向下选择 metadata 中的名称和标签
  • containers 中的 name 定义容器启动后的名称,
  • containers 中的 ports 定义容器移动后暴露出来的端口
  • containers 中的 image 启动容器使用的镜像
  • service 中的 strategy 指定升级的策略,下面只有 滚动策略的配置
  • targetPort 容器端口号
  • port 服务端口号 或者 cluster 端口号, 可能说的不太准确
  • nodePort 暴露给外部的端口号

ApplicationController

  • kubectl create -f ReplicationController.yaml
    • 创建
  • kubectl get pod
    • 查看创建的 pod
  • kubectl describe ReplicationController/nginx
    • 查看描述
  • kubectl edit -f ReplicationController.yaml
    • 编辑 yaml, 用这个方法修改配置文件。编辑后自动启用
---
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 4
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.7.9
          ports:
            - containerPort: 80

label 的使用

  • kubectl create -f label.yaml
    • 创建一个 pod
  • kubectl get pods -l env=prod
    • 获取环境为 prod 的 pod
  • kubectl get pods -l app=nginx
    • 获取 app 为 nginx 的 pod
  • kubectl get pods -l 'env in (prod, qa)'
    • 查找环境为 prod qa 的 pod
apiVersion: v1
kind: Pod
metadata:
  name: label-nginx
  labels:
    app: pod-label-example
    env: prod
spec:
  containers:
  - name: label-web
    image: nginx
    ports:
    - containerPort: 80

Deployment

  • kubectl create -f deployment.yaml
  • kubectl get deployment
  • kubectl describe deployment nginx-deployment
  • kubectl apply -f deployment.yaml
    • 滚动升级
  • watch -n l kubectl get deployment
    • 监控 deployment 的情况
  • kubectl get pods -o wide
  • cubectl rollout status deployment/nginx-deployment
    • 回滚
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-demo
  labels:
    app: deployment-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

强制端口号暴露

  • kubectl get deploy
    • 获取所有的 deployment 并选择 nginx-deployment-demo
  • kubectl expose deployment nginx-deployment-demo --type=NodePort
    • 使用 NodePort 类型暴露
  • kubectl get service
    • 查看service: nginx-deployment-demo NodePort 10.104.29.106 none 80:30283/TCP 10s
  • 本地使用 localhost:30283 就可以争取访问

Service

service

  • 设计 k8s 的网络
    • 可以创建 4 中类型的 service;clusterIp, NodePort, LoadBalancer, ExternalName
  • kubectl explain service.spec
    • 查看 配置说明
  • kubectl get service
    • 查看service: nginx-service NodePort 10.98.236.6 none 8080:30006/TCP 7s
  • 本地使用 localhost:30006 就可以争取访问
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
  - name: http
    port: 8080
    nodePort: 30006
    targetPort: 80
    protocol: TCP
  

k8s 结构 三层网络

  • Node
    • nodeIp(物理机 ip) NodeIp(node): nodePort
  • Service
    • clusterIp(pod <-> service):port
  • Pod
    • podIp(pod - pod):targetPort

clusterIP

  • 不需要外部访问,只提供 cluster 内部 服务访问
  • kubectl create -f clusterIpservice.yaml
    • 创建 cluserIp
  • kubectl get service
    • 获取去查看 cluterIP
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
  - port: 8080
    targetPort: nginx-port
    protocol: TCP
  selector:
    app: nginx
  type: ClusterIP

Overlay Network

  • 实现不同Node 之间 pod 的交互; CNI 规范
  • KubeProxy 把 service ip 之间的访问转化为 pod 之间的访问
    • 三种模式: userspace,iptables

apiServer 调用过程 (waiting)

etcd (waiting)