云原生应用与k8s

Posted by jabin on October 13, 2020

本文分两部分, 第一部分(一~七)介绍云原生相关概念和关键技术, 第二部分(八~十一)介绍k8s相关内容,包括架构、网络、存储、实践等

一、云原生的定义 CNCF

  1. 容器化
  2. 动态编排调度 – 提供资源的利用率、降低运维成本
  3. 微服务

二、云原生的关键技术

容器->微服务->DevOps

三、微服务&服务网格(Service Mesh)

图片描述

3.1. 微服务 VS 单体应用

  1. 单体应用存在服务的技术栈要求一致、多个功能更新/迭代需要同步、耦合导致单一模块的问题会相互影响
  2. 微服务是将复杂的应用拆分成独立自治的多个小服务,服务与服务通过松耦合的方式交互
  3. 微服务的架构,包含API网关, 服务注册与发现,服务间通信(服务网格,Istio),服务可靠性保证(熔断、服务降级、冗余与容灾)

3.2. Service Mesh

图片描述

四、容器–docker & k8s

  1. 容器镜像
  2. 容器运行时(namespace&cgroups&unionFS)
  3. 容器网络、存储(none、container、bridge, 第三方如flannel等; volum、bind mount、tmpfs mount)
  4. 容器编排调度(k8s等)

图片描述

五、不可变的基础设施

  1. 相对于传统的可变基础设施。 存在雪花服务器、配置漂移等问题
  2. 实例不可更改,直接重新调度新的

六、声明式API

  1. 指定最终的状态, 然后系统通过不断的调整当前状态(基于资源),直至达到期望的状态
  2. 在k8s中,就是在yaml文件中定义对象的声明, 指定最终要什么样子, 然后交给k8s实施
    [root@jabin-devcloud ~]# cat my_namespace.yaml 
    apiVersion: v1
    kind: Namespace
    metadata:
      name: jabin-test
    

七、DevOps

自动化部署,持续集成(编码、单元测试)、持续交付(测试->预发布)、持续部署(生产环境) 图片描述

八、k8s概览

8.1 k8s的架构

图片描述

  1. kubectl。 命令行接口,用于执行k8s集群的操作命令
  2. Api-Server。提供对k8s各种对象(pod, depoyment等)的增删改查操作;k8s组件间的通信都通过这个
  3. scheduler。调度pod到满足调度策略(预判->优先级)的Node上,并把绑定的信息写入etcd
  4. controller-manage。内涵多种xxx_controller(depolyment, Namespace, Node);维护集群的状态 go wait.Until/Forever
  5. etcd。 存储k8s的数据,和状态信息

  6. kubelet。负责维护Node上pod的生命周期
  7. kube-proxy。外部服务访问内部Pod的代理(默认基于iptables)
  8. pod。 调度的最小单元,同个pod内的容器间可实现网络和存储的共享

8.2 k8s的常用对象及操作

  1. Namespace、Pod(preStop)、RC/RS、Node、Service/Ingress
  2. Deployment
// kubectl apply -f nginx_test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  progressDeadlineSeconds: 600    // 执行操作的超时时间
  replicas: 20
  revisionHistoryLimit: 10    // 保存的历史版本数量
  selector:
    matchLabels:
      app: nginx-deployment
  strategy:
    rollingUpdate:
      maxSurge: 25%         // 升级过程中最多可以比原先设置多出的 pod 数量
      maxUnavailable: 25%   // 升级过程中最多有多少个 pod 处于无法提供服务的状态
    type: RollingUpdate     // 更新策略
  template:
    metadata:
      labels:
        app: nginx-deployment
    spec:
      containers:
      - name: nginx-deployment
        image: nginx:1.9
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

九、k8s的网络

  1. Overlay, underlay(物理层)
  2. Flannel && calico (基于隧道–打解包源ip和目标ip,性能消耗比较大; 基于路由–路由广播,不进行打解包,路由表膨胀)
  3. CNI规范、标准

9.1 场景1–同个pod内的容器间通信 (共享相同的网络,Localhost)

图片描述

  1. 共享卷
  2. IPC
  3. localhost

9.2 场景2–同个node的不同pod间的容器通信

图片描述

9.3 场景3–集群内不同node的容器间通信 (flannel)

图片描述

9.4 场景4–外部和集群内的容器通信(Service && Ingress)

  1. Service。 enpoints DNS 图片描述
  2. Ingress 图片描述

十、k8s的存储

10.1 容器的存储

图片描述

  1. docker Volum & bind mount

10.2 k8s持久化存储

  1. 比如像redis/tcaplus集群要用k8s部署, 就需要用到了
  2. PV & PVC
  3. CSI. 容器存储接口标准

十一、k8s的简单实践

基于minikube搭建单机k8s

11.1 安装

// 1. 安装 kubectl
164  curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
166  mv ./kubectl /usr/local/bin/kubectl
169  chmod +x kubectl 
172  kubectl -v
173  kubectl version

// 2. 安装minikube
175  curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64   && chmod +x minikube
177  install minikube /usr/local/bin/
178  minikube config set vm-driver none

// 3. 启动问题解决 
180  yum install conntrack
185  yum install conntrack-tools
//主机名规范问题
188  vi /etc/hosts
189  hostname jabin_devcloud
196  minikube start
197  minikube status
198  minikube dashboard
// 网络策略问题
199  kubectl create deployment hello-node --image=k8s.gcr.io/echoserver:1.4
200  kubectl get services
201  minikube status
203  netstat -anp|grep minikube
205  kubectl cluster-info
206  kubectl version
215  kubectl get services
217  wget "http://download.devcloud.oa.com/iProxy.sh" -O iProxy.sh
221  source iProxy.sh -uninstall

11.2 实践–在k8s上部署nginx

  1. 两个描述文件
    // 1. nginx应用的描述文件8.2已给出
    // 2. service 描述文件
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
    spec:
      type: NodePort
      selector:
     app: nginx-deployment
      ports:
      - protocol: TCP
     port: 80
     targetPort: 80
     nodePort: 32666
    
  2. 具体步骤
    // 1. 创建nginx应用
    kubectl apply -f nginx_test.yaml 
    // 2. 集群内通过访问clusterip,测试部署是否成功
    [root@VM_10_209_centos ~]# curl 192.168.10.6
    //<!DOCTYPE html>
    //<html>
    //<head>
    //<title>Welcome to nginx!</title>
    //...
    // 3. 创建NodePort类型的service,暴露给集群外访问
    [root@VM_10_209_centos ~]# kubectl apply -f nginx_svc.yaml 
    service/nginx-service configured
    [root@VM_10_209_centos ~]# curl 127.0.0.1:32666
    //<!DOCTYPE html>
    //<html>
    //<head>
    //<title>Welcome to nginx!</title>
    //<style>
    //    body {
    //        width: 35em;
    //        margin: 0 auto;
    //        font-family: Tahoma, Verdana, Arial, sans-serif;
    //    }
    //...
    

十二、参考链接

  1. k8s开源协同系列课程
  2. k8s源码分析
  3. k8s官方文档
  4. minikube搭建
  5. 理解flannel网络