一.导言
随着容器技术的发展,软件界对容器管理的需求越来越迫切,于是出现了一些kubernetes(即k8s),docker swarm 等容器管理软件。同时k8s等服务编排软件也让微服务变得可行,快速扩容缩容,自动处理网络配置等特性也让k8s如火如荼。
k8s能做什么?
- 服务发现和负载均衡,使用dns或者ip对外暴露容器服务,并提供负载均衡
- 存储管理,多种存储选择
- 拟态扩容缩容,根据需求扩容,缩容,并且k8s会尽力达到desired state
- 自动装箱,比如配置每个容器能使用的CPU和RAM资源,k8s将容器分配到合适的节点以最大化利用系统资源
- 自动处理故障,当容器失效时,能快速处理,并且不会对客户端有影响
- 配置和秘钥管理
二.k8s架构及相关概念

control plane:控制台
kube-apiserver: k8s的核心api服务,一般需要做横向扩展
etcd: 提供一致性和高可用的的键值存储,k8s用来存储集群数据。etcd是一款用go语言编写的分布式kv存储,基于raft算法,能提供更稳定的高负载稳定读写能力。
kube-scheduler: 为未分配节点的pod寻找合适的节点
kube-controller-manager: 包括以下controller
- node controller: 监视节点下线
- job-controller: 监视Job 运行状况
- EndpointSlice controller: 即端点列表控制器,为Service 和 pod 提供连接
cloud-controller-manager: 云服务控制管理
node:节点,对应物理机或者虚拟机
kubelet: 运行在节点中的agent,确保容器运行在pod中
kube-proxy: 运行在节点中的网络代理,为Servcie提供支持

pod: k8s 抽象出来的的管理单元,包括一个或者多个容器,共享存储,网络,端口等资源
volume: 存储单元抽象
container:容器,比如docker

Deployment:部署,描述部署的容器,复制等信息,一个典型的Deployment如下- apiVersion: apps/v1 (版本)
- kind: Deployment (对象类型)
- metadata: (元数据)
- name: nginx-deployment (name, UIDs)
- spec: (目标状态)
- selector:
- matchLabels:
- app: nginx
- replicas: 2 # tells deployment to run 2 pods matching the template
- template:
- metadata:
- labels: (labels and selector)
- app: nginx
- spec:
- containers:
- - name: nginx
- image: nginx:1.14.2
- ports:
- - containerPort: 80
复制代码 Service:基于pod创建对外或者对内网络服务
三.构建无状态服务
无状态服务:服务不依赖自身的状态,实例的状态数据可以维护在内存中。
构建步骤如下:
0.笔者这里使用minikube进行测试,先启动minikube - minikube start
- minikube dashboard # 启动后台管理界面
复制代码
1.执行部署- apiVersion: apps/v1
- kind: Deployment
- metadata:
- labels:
- app.kubernetes.io/name: load-balancer-example
- name: hello-world
- spec:
- replicas: 5
- selector:
- matchLabels:
- app.kubernetes.io/name: load-balancer-example
- template:
- metadata:
- labels:
- app.kubernetes.io/name: load-balancer-example
- spec:
- containers:
- - image: gcr.io/google-samples/node-hello:1.0
- name: hello-world
- ports:
- - containerPort: 8080
复制代码- kubectl apply -f https://k8s.io/examples/service/load-balancer-example.yaml
复制代码 2.查看部署信息- kubectl get deployments hello-world
- kubectl describe deployments hello-world
- NAME READY UP-TO-DATE AVAILABLE AGE
- hello-world 5/5 5 5 12m
复制代码 3.查看副本集
这里我们创建了五个副本- kubectl get replicasets
- kubectl describe replicasets
- NAME DESIRED CURRENT READY AGE
- hello-world-644f58f5f4 5 5 5 12m
复制代码 4.创建Service暴露部署- kubectl expose deployment hello-world --type=LoadBalancer --name=my-service # LoadBalancer表示使用负载均衡的方式
复制代码 5.查看Service- kubectl get services my-service
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- my-service LoadBalancer 10.102.184.247 <pending> 8080:31755/TCP 3s
复制代码 6.查看Service详细信息- kubectl describe services my-service
复制代码 [code]Name: my-serviceNamespace: defaultLabels: app.kubernetes.io/name=load-balancer-exampleAnnotations: Selector: app.kubernetes.io/name=load-balancer-exampleType: LoadBalancerIP Family Policy: SingleStackIP Families: IPv4IP: 10.102.184.247IPs: 10.102.184.247Port: 8080/TCPTargetPort: 8080/TCPNodePort: 31755/TCPEndpoints: 10.244.0.87:8080,10.244.0.88:8080,10.244.0.89:8080 + 2 more... # 端点Session Affinity: NoneExternal Traffic Policy: ClusterEvents: |