k8s学习笔记

126 阅读5分钟

Kubernetes是什么?

一个大规模的容器编排系统。 具有以下特性:

  • 服务发现和负载均衡 可以使用DNS名称或ip公开容器,k8s可以负载均衡的分配网络流量。
  • 存储编排 允许你自动挂载你选择的存储系统,例如本地存储,公共云提供商等。
  • 自动部署和回滚 k8s可以部署创建新容器,删除现有容器并将他们的所有资源用于新容器。
  • 管理容器资源 k8s可以管理每个容器所需的cpu和内存。
  • 自动修复 k8s可以重新启动失败的容器,替换容器,杀死不响应的容器。
  • 秘钥和配置管理 k8s允许存储和管理敏感信息,例如密码

k8s架构是什么样的?

k8s集群是 N个master 节点 + N 个worker节点。 N>=1

各个组件如下:

  • Master 节点:
  • Worker 节点:
  • API Server:类似门面模式,隐藏了决策者,接受程序员的命令。
  • Controller manager : 决策者
  • kubelet: 管理容器中的应用,可以对应用进行健康检查。它保证容器都运行在pod中。
  • kube-proxy: 用于网络访问应用的,存储应用地址的。
  • kube-Scheduler:可以选择节点让新创建的pod在上面运行。
  • etcd: 是具有一致性和高可用性的键值数据库,用于保存k8s集群数据的后台数据库。

集群部署组件:

  • kubectl : 是程序员给k8s发送命令的。
  • kubeadmin:帮助程序员管理k8s。

NameSpace

名称空间,用来对集群资源进行隔离。默认只隔离资源,不隔离网络。

命令:

kubectl get [namespace|ns]            查看所有名称空间

kubectl create ns [namespce名称]      创建名称空间

kubectl delete ns [namespace名称]     删除名称空间

Pod

在其中运行一组容器。是k8s应用中的最小单位。 相当于docker中的容器,可理解为应用, k8s 会对每个pod分配一个ip,这个ip地址只能在k8s集群中访问。

查看Pod:

kubectl get pods -A                 查看所有的pod
kubectl get pods -n [namespace]     查看指定指定namespace下的pod。
kubectl get pod                     获取默认命名空间下的pod
kubectl get pod -owide              可以查看pod更加详细的信息,比如ip地址。
kubectl describe pod [pod名称]      查看pod的详细信息。
kubectl get pod --show-labels       查看pod的标签

创建Pod:

kubectl run [pod名称] --image=[docker镜像名称]        根据镜像创建pod

删除Pod:

kubectl delete pod  [pod名称]        

查看pod中运行应用的日志:

kubectl logs  [pod名称]

进入Pod中:

kubectl exec -it [pod名称]  -- /bin/bash  

Deployment

使Pod拥有很多副本,自愈,扩容的能力。就是可以控制pod的行为。 无状态应用部署,比如微服务

创建deploy

kubectl create deployment [pod名称] --image=[镜像名称]  创建deployment
kubectl create deployment [pod名称] --image=[镜像名称] --replicas=3   创建3个部署

查看deploy:

kubectl get deploy                      查看部署
kubectl get deploy/[deploy名称] -oyaml  查看部署,以yaml输出。

扩缩容

将pod的个数设置为5个
kubectl scale --replicas=5 deploy/[deploy名称]
或者通过以下命令编辑 replicas 属性
kubectl edit deploy [deploy名称]

自愈&故障转移

自愈:当pod故障了,自动重启

故障转移:当某台机器上pod故障了,可以在其他机器上自动拉起一份。

滚动更新

在软件升级部署中,可以继续对外提供功能。 先启动一个新pod,再关闭一个旧pod。 此时,是新旧两个版本同时对外提供,直到新pod全部启动,旧pod全部下线。

kubectl set image deploy/[deploy名称] [原有镜像]=[新镜像] --record

版本回退

查看历史记录:

# 查看deploy历史记录
kubectl rollout history deploy/[deploy名称]

# 查看某个历史版本详情
kubectl rollout history deploy/[deploy名称] --revision=[版本号]

# 回滚到上次
kubectl rollout undo history deploy/[deploy名称]

# 回滚到指定版本
kubectl rollout undo deploy/[deploy名称] --to-revision=[版本号]

StatefulSet

有状态应用部署 比如 Redis,提供稳定存储,网络等功能。

DaemonSet

守护型应用部署,比如日志收集组件

Job/CronJob

定时任务部署,比如垃圾清理组件,可以在指定时间运行。

Service

提供Pod的服务发现和负载均衡。 即pod缩放后,service可以自动感知到,从而将访问pod的请求自动负载均衡到可用的pod上。

image.png

查看service

kubectl get service

image.png

删除service

kubectl delete svc [service名称]

暴露deploy

 # 默认通过集群ip对外暴露,集群内部可以访问。
 kubectl expose deploy [Pod的标签]  --port=[Pod的port名称]  --target-port=[对外暴露端口]
 
 # 采用NodePort模式,集群内外都可以访问,每个pod都会暴露一个相同的对外端口,通过任意一个pod的ip+端口就可以负载均衡的访问到集群上的服务。k8s会在30000-32767之间随机暴露端口。
 kubectl expose deploy [Pod的标签]  --port=[Pod的port名称]  --target-port=[对外暴露端口] --type=NodePort
 

通过暴露一组pod对外的端口后,就可以通过service的ip:对外端口 就可以访问 pod内的服务。 也可以通过域名:端口也可以访问,不过这只能在k8s集群内部的pod中可以访问。 域名规则: pod的标签.命名空间.svc

Ingress

Service 的统一网关入口,流量首先通过Ingress,通过ingress将请求路由到指定的service中,内部就是一个nginx。

查看Ingress

kubectl get ingress 

存储抽象

就是在不同节点上共享目录 PV PVC

ConfigMap

抽取应用配置,给pod提供配置,且可以自动更新,数据保存在etcd中。

创建配置集

kubectl create cm [配置集名称] --from-file=[配置文件地址]

查看配置集

kubectl get cm 

Secret

存放一些密码信息

命令: kubectl get secret