“爷爷,Kubernetes是什么?” “那是宇宙啊” (3) -运维篇-
早上好,午安,晚上好。
我是zerobillbank株式会社的基础设施工程师,大家都叫我tomato。
這次是Kubernetes系列的最終篇,我想談談在建置時的故障排除以及運營監控的相關話題。
顺便提一下,上一篇文章在这里:
“爷爷,kubernetes 是什么?””…那是宇宙呀”(1)- 简介篇-
“爷爷,kubernetes 是什么?””…那是宇宙呀”(2)- 构建篇-
构建的故障排除
我认为作为处理建构时错误的措施,首先应该对发生在Pod中的错误以及发生在其他地方的错误进行分类。
Pod的错误
通过Pod来检查是否发生错误很容易。
当使用kubectl get po来检查Pod时,正常情况下,STATUS应该为Running,STATUS应该为1/1,即分子和分母应该相等。
$ kubectl get po
NAME READY STATUS RESTARTS AGE
sample-775487cf8-d5czn 0/1 ImagePullBackOff 2 15m
如果不是这种情况,就会出现错误,请使用describe命令检查错误的原因。
$ kubectl describe po sample-775487cf8-d5czn
---省略
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal BackOff 28s (x4 over 1m) kubelet, ip-xxx.internal Back-off pulling image "nginx:1.123"
Warning Failed 28s (x4 over 1m) kubelet, ip-xxx.internal Error: ImagePullBackOff
当使用describe命令检查目标Pod时,会在事件栏中输出错误事件。
在上述例子中,由于指定了不存在的nginx版本,因此出现了无法拉取镜像的错误。
调查命令
虽然可以使用以上的describe命令进行调查,
但在大多数情况下,只需输入以下两个命令中的一个,
即可找到错误的原因。
日志命令
kubectl logs [deployment名]
获取活动
kubetctl get events | grep [deployment名]
无法访问的错误
在Pod正常运行的情况下,如果无法正常访问网页等,以下是解决方法。
在这种情况下,我们通过以下步骤确定连接中断的位置。
-
- 通过Pod进行访问验证
-
- 通过Service进行访问验证
- 通过Ingress进行访问验证
通过Pod进行访问确认
$ kubectl exec -it [Pod名] -- /bin/sh
由于alpine等操作系统通常没有预装工具,所以在这种情况下可使用以下命令进行安装。
# update
apt update
# curlのインストール
apt install -y curl
# netstatのインストール
apt install -y net-tools
# aptがない場合
apk -U add curl
apk add net-tools
确认正在运行的进程
$ netstat -pant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 1/nginx: master pro
使用上述命令,确认目标应用程序正在运行,并查看它所使用的端口号。
$ curl http://localhost:3000
welcome nginx!!
如果显示出这个,那么在 Pod 中进行的访问测试就没有问题。
通过服务来确认访问
$ curl http://nginx:3000
welcome nginx!!
如果这样显示,那么通过2. Service访问确认就没有问题了。
常见的错误之一是在service.yaml文件中,端口(port)和目标端口(targetPort)的声明错误。
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
port… 在image内的端口号。如果在上述的Pod中使用netstat命令,则为Pod内的端口号。
targetPort… 在kubernetes上的端口号。与Service相关联。
在这种情况下,图像内的端口号为3000,所以端口应该是3000而不是80。
在deployment.yaml文件中,还有一个名为containerPort的项目,需要与service.yaml文件中的targetPort进行匹配。
通过Ingress进行访问确认
如果在以上的情况下没有问题而无法访问,可以考虑与域名相关的问题。根据实际访问页面时出现的错误消息,尝试检查域名和SSL证书等方面。
利用
应用
运用手段
运用方法
使用
运用媒介
运用工具
运用技巧
我认为在使用kubernetes进行管理时,使用yaml确保幂等性,但在操作上需要注意一些与yaml相关的事项。
在申请之前进行差异性比较。
在使用 apply 命令进行应用之前,请务必使用 diff 命令对差异进行确认。这样可以避免意外应用错误的 YAML 文件。
# 想定の差分が出ることを確認
$ kubectl diff -f nginx/deployment.yaml
# 適用
$ kubectl apply -f nginx/deployment.yaml
# 差分が出ないことを確認
$ kubectl diff -f nginx/deployment.yaml
在更新时使用rollout命令
在更新Pod时,使用rollout restart命令而不是delete命令。
即使使用delete命令删除Pod,如果存在部署,Pod将会重新启动,
但在删除和重新启动之间会发生服务中断。
而使用rollout restart命令,可以逐步将旧的Pod迁移到新的Pod上,而不会中断服务,可以实现无服务中断的重新启动。
如果只更新配置文件、密钥等资源时,Pod将不会重新启动,因此在此情况下,请确保不要忘记执行rollout restart命令以加载新的定义。
$ kubectl rollout restart deploy/nginx
deployment.apps/nginx restarted
额外的东西
当您键入kubectl api-resources时,可以查看可用资源的列表。
此外,您还可以检查每个资源的快捷名称和在yaml中要记下的apiVersion,
这是一个非常方便的命令,当发生问题时可以记住。
$ kubectl api-resources
NAME SHORTNAMES APIGROUP NAMESPACED KIND
bindings true Binding
componentstatuses cs false ComponentStatus
configmaps cm true ConfigMap
endpoints ep true Endpoints
events ev true Event
limitranges limits true LimitRange
namespaces ns false Namespace
nodes no false Node
persistentvolumeclaims pvc true PersistentVolumeClaim
persistentvolumes pv false PersistentVolume
pods po true Pod
...
监视
我认为在监视方面有很多不同的工具可供选择,但如果想要简单方便地开始,我觉得以下工具与之兼容性良好。
从免费的UI日志显示到警报发出,可以一次性完成所需的全部任务。
再次helm(包管理工具)已经更新到3.x版本,安装变得非常容易了。
然而,如果应用默认配置,我们将无法了解和管理其具体数值,
所以我认为最好的做法是先在本地fetch然后再进行install。
只需一种选项:
每个设置值都在 values.yaml 中进行了记录,
您可以找到要更改的项目并进行修改,这样在安装或升级时将应用这些更改。
安装
请参考以下链接了解有关Helm安装的详细信息:
https://helm.sh/ja/docs/intro/install/
获取
$ helm repo update
$ helm fetch stable/filebeat
$ helm fetch stable/logstash
$ helm fetch stable/elasticsearch
$ helm fetch stable/kibana
$ helm fetch grafana/grafana
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update
$ helm fetch prometheus-community/kube-prometheus-stack
安装
$ helm install -name filebeat -n monitoring -f filebeat/values.yaml stable/filebeat
$ helm install -name logstash -n monitoring -f logstash/values.yaml stable/logstash
$ helm install -name elasticsearch -n monitoring -f elasticsearch/values.yaml stable/elasticsearch
$ helm install -name kibana -n monitoring -f kibana/values.yaml stable/kibana
$ helm install -name grafana -n monitoring -f grafana/values.yaml grafana/grafana
$ helm install -name prometheus -n monitoring -f kube-prometheus-stack/values.yaml prometheus-community/kube-prometheus-stack
安装非常简单,只需执行这一步操作!
顺便提一下,当您想要更新时,只需将 “install” 的部分更改为 “upgrade” 即可。
由于Grafana的配置有些复杂,因此可以参考我之前写的下面的文章。使用helm3可以非常简单地将Grafana部署到Kubernetes中,就像种番茄一样简单。
结束
所以,在三次的篇章中我解释了 Kubernetes。如果大家有任何发现的地方,我将会随时进行补充。我希望能够有越来越多的工程师陷入 Kubernetes 的深渊。祝大家享受美好的 Kubernetes 生活!
再见?♂️
最后
ZEROBILLBANK现正在招募一起工作的伙伴。
工作内容包括使用JavaScript、区块链、Kubernetes等创建各种API。
目前工程师人数约为5人。虽然是初创公司,但工作环境相当优越。
ZEROBILLBANK JAPAN公司。