kubernetes入门
一.导言随着容器技术的发展,软件界对容器管理的需求越来越迫切,于是出现了一些kubernetes(即k8s),docker swarm 等容器管理软件。同时k8s等服务编排软件也让微服务变得可行,快速扩容缩容,自动处理网络配置等特性也让k8s如火如荼。
k8s能做什么?
[*]服务发现和负载均衡,使用dns或者ip对外暴露容器服务,并提供负载均衡
[*]存储管理,多种存储选择
[*]拟态扩容缩容,根据需求扩容,缩容,并且k8s会尽力达到desired state
[*]自动装箱,比如配置每个容器能使用的CPU和RAM资源,k8s将容器分配到合适的节点以最大化利用系统资源
[*]自动处理故障,当容器失效时,能快速处理,并且不会对客户端有影响
[*]配置和秘钥管理
二.k8s架构及相关概念
https://img2023.cnblogs.com/blog/431015/202305/431015-20230501103513235-724530607.png
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提供支持
https://img2023.cnblogs.com/blog/431015/202305/431015-20230501110226705-588782013.png
pod: k8s 抽象出来的的管理单元,包括一个或者多个容器,共享存储,网络,端口等资源
volume: 存储单元抽象
container:容器,比如docker
https://img2023.cnblogs.com/blog/431015/202305/431015-20230501111643164-419131820.png
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: 80Service:基于pod创建对外或者对内网络服务
三.构建无状态服务
无状态服务:服务不依赖自身的状态,实例的状态数据可以维护在内存中。
构建步骤如下:
0.笔者这里使用minikube进行测试,先启动minikube
minikube start
minikube dashboard # 启动后台管理界面https://img2023.cnblogs.com/blog/431015/202305/431015-20230503092820988-209120431.png
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: 8080kubectl apply -f https://k8s.io/examples/service/load-balancer-example.yaml2.查看部署信息
kubectl get deployments hello-world
kubectl describe deployments hello-world
NAME READY UP-TO-DATE AVAILABLE AGE
hello-world 5/5 5 5 12m3.查看副本集
这里我们创建了五个副本
kubectl get replicasets
kubectl describe replicasets
NAME DESIRED CURRENT READY AGE
hello-world-644f58f5f4 5 5 5 12m4.创建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 3s6.查看Service详细信息
kubectl describe services my-serviceName: 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:
页:
[1]