「爷爷,Kubernetes是什么?」「……那是宇宙。」(2)-建设篇-
你好,我是zerobillbank株式会社的基础设施工程师tomato,大家好。
这次是继上次之后的第二次关于kubernetes的讨论。上次我们介绍了kubernetes的概述部分,所以这次我们会更具体地讲解如何构建kubernetes的环境。
顺便提一下,上一篇文章在这里
“爷爷,”什么是Kubernetes?”,”…那就是宇宙花园啦”(1)-概述篇-
非常厉害的图
在理解 Kubernetes 构建过程中,我鼓起了勇气仅列出三个关键要点。
-
- Deployment
Podを定義するもの
Service
内部IP
Ingress
外部IP
我认为我们可以首先以这三个基本点作为考虑的轴心,这样可以避免被卷入Kubernetes的困境!
不朽的部署
「哎呀,他根本不死嘛..!?」 「不,我们要瞄准他的核心!!」
不是有那种击倒了它还会复活的boss吗?
他的身体就像是个Pod,而核心部分则是Deployment…差不多就是那种感觉。
在部署中,需要记录Pod的定义。
Pod中包含实际运行的应用程序(例如nginx或自己创建的应用程序)。
我在第一部分已经介绍了Pod的自动缩放和自我修复功能,
而这正是Deployment的实现。
例如,在部署方面,如果写下“始终启动两个名为A的Pod镜像”的定义,则会始终启动两个A的Pod。
因此,即使手动删除一个A的Pod,也会新建一个A的Pod,
确保始终有两个Pod正在运行。
除了還有類似的ReplicaSet和DaemonSet等,但為了盡量簡單地解釋,這次故意不提及。能夠創建Pod的不僅僅是Deployment,但是Deployment仍然是最常用的基本資源。
引きこもりのサービス –> 宅居服务 jū fú wù)
Note: 宅居服务 is a direct translation that conveys the meaning of “service for hikikomori (people with social withdrawal tendencies)” in Chinese.
在Service中定义内部IP。
换句话说,即使通过Deployment创建了Pod,
如果没有定义Service,那么就无法从任何地方访问该Pod。
这就是最强的隔离状态。
内部IP也被称为私有IP,使得在同一kubernetes集群内进行访问成为可能。
但是无法通过互联网进行访问。
可以类比为公寓的房间号或分机号接近的概念。
巴黎的Ingress
Ingress定义外部IP地址。
只需一种选择:
在定义上述Service的阶段,只有在相同的kubernetes集群内才能访问,无法从外部(互联网)访问。
要使外部访问成为可能需要使用Ingress。
Ingress会将公共IP与Kubernetes的入口进行关联,
从而将Kubernetes释放到外界。
通过互联网访问时,会依次经过Ingress->Service->Pod。
只要知道外部IP(通常与其相关的域名),任何人都可以在互联网上访问,就像知道一个地址一样。大家都来吧,我们都是朋友。就像派对人一样(有偏见)。
我会构建zoy
虽然规模很小,但我想利用上述三个资源来开始使用Kubernetes进行构建!但在此之前,我们需要做一些简单的准备工作。
创建集群
在进行Kubernetes的构建时,首先需要创建一个集群。
集群是指在第一次介绍中所描述的节点定义等。
简单复习一下,节点是物理计算机的单位,
在Kubernetes中定义了使用哪些计算机以及使用多少台的规定。
只需要一个选项:实际的创建方法,我认为通过参考使用云端的参考资料比在这里长篇大论地解释要容易得多。这不是太困难的事情,在现今的时代,可以轻松地通过门户进行操作。
例如,如果使用Azure,如下所示。
“YAML是什么东西啊?”
所以,另一个要准备的是一个名为yaml的文件。在这个文件中,我们将写入上述Deployment、Service等定义。
yaml的含义是什么…
-
- ファイル形式の一種だよ
- データ構造を表現できるよ
嗯,這種感覺也不是很複雜,只是看具體例子的話可能更容易理解。
部署的YAML示例
以下的YAML定义了代表Web服务器的nginx的资源。
即使没有先验知识,我认为你大概能理解写了些什么。
重点在于image: nginx部分,这里记录了要加载哪个Docker镜像。
只要是Docker官方镜像中存在的镜像,只需写上镜像名称即可调用。
如果要使用原始的Docker映像,您需要按照以下步骤进行操作:
创建Docker文件 -> 将Docker文件注册到容器注册表中
将容器注册表的URL写入图像标签中。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: sample
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 80
Service的yaml示例。
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: sample
labels:
app: nginx
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80 # Default port for image
targetPort: 80
“Ingress的yaml示例”
需要预先从注册商那里获取域名。
虽然也可以从云服务中分配,但例如在Azure的情况下,将会成为xxx.japaneast.cloudapp.azure.com这样的地址。
如果你认为xxx.com或者xxx.jp是好的选择,那么你需要从域名注册处购买所需的域名。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx
namespace: sample
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/force-ssl-redirect: 'true'
spec:
tls:
- hosts:
- xxx.com
secretName: tls-secret
rules:
- host: xxx.com
http:
paths:
- backend:
serviceName: nginx
servicePort: 80
path: /
yaml应用
现在我们终于要开始应用YAML并构建Kubernetes了!
kubectl kubectl的汉语近义词
在Kubernetes中,使用kubectl命令来进行操作。
安装方式因操作系统不同而有所不同,请参考下方内容。
适用的命令
当您成功安装了kubectl之后,将应用yaml文件进行适用。
本次我想创建一个名为sample的命名空间,并将其应用到那里。
命名空间在Kubernetes中作为一个逻辑边界存在。
启动终端,并输入以下命令。
$ kubectl create namespace sample
应用上述创建的 YAML 文件。
$ kubectl apply -f nginx/deplyment.yaml
$ kubectl apply -f nginx/service.yaml
$ kubectl apply -f nginx/ingress.yaml
用以下命令确认已应用的每个资源。
这次我们要确认资源名为nginx的存在。
$ kubectl -n sample get deplyment
$ kubectl -n sample get service
$ kubectl -n sample get ingress
然后确认Pod已从Deployment中创建出来。
$ kubectl -n sample get pod
NAME READY STATUS RESTARTS AGE
nginx-546d5b6b48-r64gr 1/1 Running 0 10s
只要没有问题,应该会在Ingress设置的域名上显示nginx的初始设置页面。
结束
这一次的情况是这样的。
虽然我们匆忙地完成了搭建,但希望下一次可以讨论一下当无法成功搭建时的故障排除,以及实际运营和监控等内容。
再见?♂️
最后
ZEROBILLBANK正在招募一起工作的伙伴。
这是一个能够使用JavaScript、区块链和Kubernetes等技术来开发各种API的工作。
目前有大约5名工程师。虽然我们是初创公司,但工作环境相当轻松舒适。
零账银行日本有限公司