本文分两部分, 第一部分(一~七)介绍云原生相关概念和关键技术, 第二部分(八~十一)介绍k8s相关内容,包括架构、网络、存储、实践等
一、云原生的定义 CNCF
- 容器化
- 动态编排调度 – 提供资源的利用率、降低运维成本
- 微服务
二、云原生的关键技术
容器->微服务->DevOps
三、微服务&服务网格(Service Mesh)
3.1. 微服务 VS 单体应用
- 单体应用存在服务的技术栈要求一致、多个功能更新/迭代需要同步、耦合导致单一模块的问题会相互影响
- 微服务是将复杂的应用拆分成独立自治的多个小服务,服务与服务通过松耦合的方式交互
- 微服务的架构,包含API网关, 服务注册与发现,服务间通信(服务网格,Istio),服务可靠性保证(熔断、服务降级、冗余与容灾)
3.2. Service Mesh
四、容器–docker & k8s
- 容器镜像
- 容器运行时(namespace&cgroups&unionFS)
- 容器网络、存储(none、container、bridge, 第三方如flannel等; volum、bind mount、tmpfs mount)
- 容器编排调度(k8s等)
五、不可变的基础设施
- 相对于传统的可变基础设施。 存在雪花服务器、配置漂移等问题
- 实例不可更改,直接重新调度新的
六、声明式API
- 指定最终的状态, 然后系统通过不断的调整当前状态(基于资源),直至达到期望的状态
- 在k8s中,就是在yaml文件中定义对象的声明, 指定最终要什么样子, 然后交给k8s实施
[root@jabin-devcloud ~]# cat my_namespace.yaml apiVersion: v1 kind: Namespace metadata: name: jabin-test
七、DevOps
自动化部署,持续集成(编码、单元测试)、持续交付(测试->预发布)、持续部署(生产环境)
八、k8s概览
8.1 k8s的架构
- kubectl。 命令行接口,用于执行k8s集群的操作命令
- Api-Server。提供对k8s各种对象(pod, depoyment等)的增删改查操作;k8s组件间的通信都通过这个
- scheduler。调度pod到满足调度策略(预判->优先级)的Node上,并把绑定的信息写入etcd
- controller-manage。内涵多种xxx_controller(depolyment, Namespace, Node);维护集群的状态
go wait.Until/Forever
-
etcd。 存储k8s的数据,和状态信息
- kubelet。负责维护Node上pod的生命周期
- kube-proxy。外部服务访问内部Pod的代理(默认基于iptables)
- pod。 调度的最小单元,同个pod内的容器间可实现网络和存储的共享
8.2 k8s的常用对象及操作
- Namespace、Pod(preStop)、RC/RS、Node、Service/Ingress
- 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的网络
- Overlay, underlay(物理层)
- Flannel && calico (基于隧道–打解包源ip和目标ip,性能消耗比较大; 基于路由–路由广播,不进行打解包,路由表膨胀)
- CNI规范、标准
9.1 场景1–同个pod内的容器间通信 (共享相同的网络,Localhost)
- 共享卷
- IPC
- localhost
9.2 场景2–同个node的不同pod间的容器通信
9.3 场景3–集群内不同node的容器间通信 (flannel)
9.4 场景4–外部和集群内的容器通信(Service && Ingress)
- Service。 enpoints DNS
- Ingress
十、k8s的存储
10.1 容器的存储
- docker Volum & bind mount
10.2 k8s持久化存储
- 比如像redis/tcaplus集群要用k8s部署, 就需要用到了
- PV & PVC
- 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. 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
- 具体步骤
// 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; // } //...
十二、参考链接
- k8s开源协同系列课程
- k8s源码分析
- k8s官方文档
- minikube搭建
- 理解flannel网络