Kubernetes是一个可以移植、可扩展的开源平台,使用声明式配置并依据配置信息自动地执行容器化应用程序的管理。在所有的容器编排工具中,Kubernetes的生态系统更大、增长更快,有更多的支持、服务和工具可供用户选择。因为k到s之间有8个字母,所以简称k8s。
容器化部署是目前主流的应用程序部署方式,在实际的生产的环境,技术人员需要管理容器化应用程序,并确保其不停机连续运行,例如停机快速重启替补容器,容器版本更新等。类似的容器管理工作需要容器管理系统来执行,而k8s就是这样的管理系统。
k8s在容器管理上具体以下特性:
k8s通过DNS名称或者容器IP地址暴露容器的访问方式,并且可以在同组容器内分发负载,实现负载均衡。
k8s可以自动挂载指定的存储系统。
通过声明式配置实现。
包括自动重启停机容器、替换或kill不健康容器、隐藏未就绪容器等。
k8s可以存储和管理敏感信息。
上图是一个k8s集群的典型架构图,各部分组件如下。
master组件是整个k8s集群的控制平台(control plane),负责全局决策和探测并响应集群事件,相当于集群的大脑。其中的API Server提供与k8s集群交互的API,Replication Controller负责监控并保证有指定数量的Pod在运行。
server的作用是与对应标签的Pod网络连接,外网可以通过server访问对应的Pod里的应用程序。
Node组件负责维护运行中的Pod并提供k8s运行时环境,其中有三个重要组件:kubelet,kube-proxy和容器引擎。
kubelet负责确保Pod中的容器始终处于运行和健康状态;kube-proxy是一个网络代理程序,负责维护节点网络规则,与server的功能关联很大;容器引擎负责运行容器,k8s支持多种引擎,包括docker、cri-o等。
Pod(上图绿色方框)包含一组容器和卷。同一个Pod里的容器共享同一个网络命名空间,可以使用localhost互相通信。一些Pod还有Label(上图标签图形),一个Label是attach到Pod的一对键/值对,用来传递用户定义的属性。
不同的操作系统,有不同的k8s安装方式,这里仅以笔者的win10系统docker desktop为例,其他方法可以看k8s官网的教程。
k8s安装官网教程
需要下载docker desktop的可以去docker desktop 官网下载。
docker desktop官网下载
回归正题,docker desktop使用k8s有两种方法,一种是使用自带的k8s。
打开docker desktop后,任务栏右键点击图标,选择About选项,会弹出docker desktop的配置。如下图所示。
这里可以清楚看到docker desktop标明了k8s的版本,想要启用的话,点击setting选项,按下图选择好后,点击Apply按钮即可。
启动安装需要一段时间,完成后,左下角会出现k8s的绿色图标,表示k8s已经就绪。
另一种安装方式是通过提前写好的配置文件,启动docker抓取需要的镜像完成安装,这样的好处可以自由选择k8s的版本,但是比较繁琐。感兴趣的可以搜索github的k8s官方仓库。
安装好了k8s,我们可以通过命令行进行一些基础操作。
以win10为例,打开cmd或者power shell。
1.检查k8s版本
kubectl version
2. 列出集群中所有API组名/版本号
kubectl api-versions
3. 列出集群名称空间
kubectl get namespaces
4. 创建新的名称空间
kubectl create namespace
5. 删除名称空间
kubectl delete namespaces
6.获取全部节点
kubectl get nodes
7.查看所有Pod
kubectl get pods
由于还没有部署任何服务,目前的pod为空
这些是一些基础性指令,更多的指令可以去官网或者学习网站查看,这里不过多赘述。
虽然命令行可以做到所有事情,但是部署服务如果使用命令行显得过于繁琐,所以k8s的可视化工具也很重要。
k8s的可视化工具有很多,比如dashboard, lens等。
笔者选择的可视化工具是Kuboard,下面是Kuboard官网链接。
Kuboard官网
安装过程很简单。以docker为例,为了方便,笔者选择直接在k8s部署Kuboard。如果想要其他安装方式可以看官网的安装教程。
1.执行安装
kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
2.等待就绪
等待所有READY为1/1时
3.访问Kuboard
在浏览器打开链接http://localhost:30080,输入初始用户名:admin,密码:Kuboard123
至此大功告成,可视化界面进行很多操作都更加方便,比如创建工作负载,导入服务等等。
下面进行一下简单的实战,使用k8s在本地部署一个简单的nginx服务。
首先介绍用Kuboard如何操作。
可视化工具的操作很便利,首先进入首页的集群,一般会有一个默认的default集群。
可以看到目前集群中是空的。然后点击左侧菜单栏的创建工作负载。
服务类型 | Deployment |
服务分层 | 展现层 |
服务名称 | nginx |
副本数 | 1 |
然后添加容器
容器名称 | nginx |
镜像 | nginx |
抓取策略 | Always |
Ports | TCP : 80 |
保存后点击应用,再点击确定。这样一个简单的nginx程序就部署完成了。
点击如下图绿色按钮就可访问部署的nginx。
点开后是nginx的默认界面。
用指令查看Pod
下面介绍如何用命令行部署。
首先,创建文件 nginx-deployment.yaml,内容如下:
apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment #该配置的类型,我们使用的是 Deployment
metadata: #译名为元数据,即 Deployment 的一些基本属性和信息
name: nginx-deployment #Deployment 的名称
labels: #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
app: nginx #为该Deployment设置key为app,value为nginx的标签
spec: #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
replicas: 1 #使用该Deployment创建一个应用程序实例
selector: #标签选择器,与上面的标签共同作用,目前不需要理解
matchLabels: #选择包含标签app:nginx的资源
app: nginx
template: #这是选择或创建的Pod的模板
metadata: #Pod的元数据
labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
app: nginx
spec: #期望Pod实现的功能(即在pod中部署)
containers: #生成container,与docker中的container是同一种
- name: nginx #container的名称
image: nginx:1.7.9 #使用镜像nginx:1.7.9创建container,该container默认80端口可访问
应用yaml文件
kubectl apply -f nginx-deployment.yaml
查看部署结果
# 查看 Deployment
kubectl get deployments
# 查看 Pod
kubectl get pods
Sercet是一种保存敏感信息例如密码,令牌或者密钥的对象,类似于configMap但是专门用于保存敏感信息。这些敏感信息可能会被用在Pod或者docker镜像中,Secret的用处就是将敏感信息与这些隔离开,更好地控制其用途,降低意外暴露的风险。
Pod使用Secret的方式有以下几种:
Secret可以由以下方式创建:
1.使用kubectl
kubectl create secret
使用此命令可以将指定文件创建为Secret。
如果想要查看Secret是否创建成功可以使用下面的命令,将列出所有Secret。
kubectl get secrets
如果想要编辑、删除Secret也可以使用Kubectl。
kubectl edit secrets
kubectl delete secret
2.使用配置文件
使用配置文件来创建Secret可以用JSON或YAML 格式在一个清单文件中定义Secret对象。
Secret资源包含 2 个键值对:data和stringData。data字段用来存储 base64 编码的任意数据。提供stringData字段是为了方便,它允许 Secret 使用未编码的字符串。data和stringData的键必须由字母、数字、-
、_
或 .
组成。
例如:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
然后调用kubectl命令
kubectl apply -f ./secret.yaml
3.使用Kustomize工具
Kustomize是kubectl支持的对象管理工具。
在kustomization.yaml
文件定义 secreteGenerator
字段, 并在定义中引用其它本地文件、.env
文件或文字值生成 Secret。
例如:
secretGenerator:
- name: database-creds
literals:
- username=admin
- password=1f2d1e2e67df
kubectl apply -k <目录路径>
上面展示只是k8s的一小部分内容,还有很多方面扩展来说,例如上面创建的nginx可以通过创建Service来暴露给其他端口,部署的也可以是更复杂的springboot程序镜像。k8s还可以和其他管理系统配合使用,例如docker、Jenkins等。学习的道路永无止境。