热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Kubernetes学习日记(四)

Kubernetes学习日记(四)暑期加入了沃天宇老师的实验室进行暑期的实习。在正式开始工作之前,师兄先让我了解一下技术栈,需要了解的有docker、k8s、springboot、

Kubernetes学习日记(四)

暑期加入了沃天宇老师的实验室进行暑期的实习。在正式开始工作之前,师兄先让我了解一下技术栈,需要了解的有docker、k8s、springboot、springcloud。

谨以一系列博客记录一下自己学习的笔记。更多内容见Github

2021/7/18



  • 上一篇 Kubernetes学习日记(三)https://www.cnblogs.com/SnowPhoenix/p/15009070.html

上一次写的Chronograf的配置文件存在一些问题,今天来改进一下。


梳理


存在的问题



  1. 在控制面板中查看到chronograf已经READY了,但是实际上仍旧不能访问,需要等待一会儿;

  2. 连接influxdb没有鉴权相关的配置;


解决方案

第一个问题通过探针来解决,第二个问题通过Secret来添加相关的配置。


资料



  • k8s官方文档——容器探针 https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes

  • k8s官方文档——API参考 https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.21/

  • k8s官方文档——任务:管理Secrets https://kubernetes.io/zh/docs/tasks/configmap-secret/


探针

探针是针对容器的,对于每个容器,可以指定一系列探针来探测容器的状态。


探测方式

一共有三种探测方式:



  1. TCP连接,通过向指定的IP和端口发起TCP连接,如果连接成功,则本次探测成功;

  2. HTTP请求,通过向指定的IP、端口、路径发送GET请求,如果获得了在[200, 400)区间内的状态码,则本次探测成功;

  3. EXEC,通过执行一定的指令,如果指令成功执行(退出码为0),则本次探测成功;

最后一种是最灵活的,但是需要在配置文件中写命令行指令,不是很美观,也更容易出错。


探测结果与容器状态的关系

有时容器会处于临时的波动状态,后续会自动恢复,此时如果探测失败,如果直接判定容器处于不可用状态可能将其重启,这是得不偿失的。

在探针(Probe )的API中,有两个字段可以进行配置:



  • failureThreshold

  • successThreshold

它们都是整数值,当连续failureThreshold次探测失败时,判定容器失效;当连续successThreshold次探测成功时,判定容器有效。

它们最小值都是1,前者默认值为3,后者默认值为1。


探针类别

一共有三种探针,每种探针都可以使用上面提到的三种探测方式(事实上,在API参考中,这三种探针的对象都是同一个类的)。



  1. livenessProbe(存活探针):用于探测容器是否存活,当该探针判定容器失效时,kubelet将关闭容器并进入重启程序;

  2. readinessProbe(就绪探针):用于探测容器是否就绪,是否可以向外提供服务,当该探针判定容器失效时,endpoints controller会将所有与这个容器关联的Service中将该容器的IP项删去,即流量不会通过Service路由到这个容器;

  3. startupProbe(启动探针):在该探针宣布判定容器有效前,所有其它探针都不会生效,当该探针宣布容器失效时,kubelet将关闭容器并进入重启程序;

当我们需要对流量进行控制的时候,我们使用readinessProbe;当我们需要主动帮助容器crash的时候,我们使用livenessProbe(如果容器陷入不可用状态会自动crash,就不需要这个探针);当容器启动后需要很长一段时间才可以提供服务的时候,我们使用startupProbe


为Chronograf配置文件添加探针

目前的配置存在的问题主要是容器还处于加载状态的时候,就已经显示为READY状态了。一般情况下不会有什么问题,但是当我们滚动更新的时候,k8s首先启动新的容器,当新的容器READY的时候,就会关闭一个旧的容器,但此时实际上新的容器还不可以使用,这个时候访问就可能发生错误,所以我们需要推迟READY的时间。

原先的样子:

apiVersion: apps/v1
kind: Deployment
metadata:
name: chronograf
namespace: default
labels:
app: chronograf
spec:
selector:
matchLabels:
app: chronograf
replicas: 2
template:
metadata:
labels:
app: chronograf
spec:
containers:
- name: chronograf
image: quay.io/influxdb/chronograf:1.9.0
# args:
# - --influxdb-url=influxdb:8086
imagePullPolicy: IfNotPresent
env:
# - name: PORT
# value: "8081"
- name: INFLUXDB_URL
value: "http://influxdb:8086"
resources:
limits:
cpu: 100m
memory: 200Mi
ports:
- containerPort: 8888

这里我还是将其改回了默认端口,毕竟没有端口冲突,没必要修改。

apiVersion: apps/v1
kind: Deployment
metadata:
name: chronograf
namespace: default
labels:
app: chronograf
spec:
selector:
matchLabels:
app: chronograf
replicas: 2
template:
metadata:
labels:
app: chronograf
spec:
containers:
- name: chronograf
image: quay.io/influxdb/chronograf:1.9.0
# args:
# - --influxdb-url=influxdb:8086
imagePullPolicy: IfNotPresent
env:
# - name: PORT
# value: "8081"
- name: INFLUXDB_URL
value: "http://influxdb:8086"
resources:
limits:
cpu: 100m
memory: 200Mi
ports:
- containerPort: 8888
startupProbe:
httpGet:
scheme: HTTP
port: 8888
path: /
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
failureThreshold: 30

因为目前存在的问题是启动时的问题,所以主要是添加了启动的探针,容器启动60s后开始探测,每10s发送一次GET请求,如果连续30次请求都没有成功,那么就重启,即如果6min仍没能够成功启动,那么就会重启。

实验一下(有一些我之前没关的):

PS D:\xxx\Learning\k8s\chronograf> kubectl get pods
NAME READY STATUS RESTARTS AGE
chronograf-84695d4bd9-2ljt2 0/1 Running 0 2m5s
chronograf-84695d4bd9-2psmf 0/1 Running 0 2m5s
influxdb-564b6d9885-6btvw 1/1 Running 2 4d16h
kubernetes-bootcamp-69b8fbf65b-b66p8 1/1 Running 3 6d14h
kubernetes-bootcamp-69b8fbf65b-cncrl 1/1 Running 3 6d14h
kubernetes-bootcamp-69b8fbf65b-n8fgr 1/1 Running 3 6d14h
kubernetes-bootcamp-69b8fbf65b-wn8sq 1/1 Running 3 6d14h
PS D:\xxxx\Learning\k8s\chronograf> kubectl get pods
NAME READY STATUS RESTARTS AGE
chronograf-84695d4bd9-2ljt2 0/1 Running 0 2m15s
chronograf-84695d4bd9-2psmf 1/1 Running 0 2m15s
influxdb-564b6d9885-6btvw 1/1 Running 2 4d16h
kubernetes-bootcamp-69b8fbf65b-b66p8 1/1 Running 3 6d14h
kubernetes-bootcamp-69b8fbf65b-cncrl 1/1 Running 3 6d14h
kubernetes-bootcamp-69b8fbf65b-n8fgr 1/1 Running 3 6d14h
kubernetes-bootcamp-69b8fbf65b-wn8sq 1/1 Running 3 6d14h

可以看见2min后开始陆续进入就绪状态,此时chronograf-service确实是可用的。


InfluxDb鉴权

从InfluxDb文档 | 授权与鉴权中可以看到,要为InfluxDb开启鉴权,需要两个条件:



  1. 创建admin用户;

  2. auth-enabled选项设置为true

通过InfluxDb文档 | 配置 #auth-enabled--false可以知道,后者可以通过环境变量来设置。

一般来说,数据库中的内容应该是持久化的,应该利用volume来保存数据,所以通过container的command参数来添加用户不太妥当,还是手动来添加用户。

在influxdb.yaml中container中添加环境变量:INFLUXDB_HTTP_AUTH_ENABLED,值为"true",注意true是YAML格式中的布尔类型,而环境变量需要的是字符串类型,需要通过双引号来转义:

apiVersion: apps/v1
kind: Deployment
metadata:
name: influxdb
namespace: default
labels:
app: influxdb
spec:
selector:
matchLabels:
app: influxdb
replicas: 1
template:
metadata:
labels:
app: influxdb
spec:
containers:
- name: influxdb
imagePullPolicy: IfNotPresent
image: influxdb:1.8
env:
- name: INFLUXDB_HTTP_AUTH_ENABLED
value: "true"
resources:
limits:
cpu: 100m
memory: 200Mi
ports:
- containerPort: 8086

因为我们关注的主要是chronograf,所以就先不为其配置volume了。

kubectl apply -f influxdb.yaml后,通过kubectl exec -it po/ -- bash进入容器,参照InfluxDb文档 | 用户管理命令,创建好admin用户。

PS D:\xxx\Learning\k8s\chronograf> kubectl exec -it po/influxdb-5f7d9c65f9-9sd7s
-- bash
root@influxdb-5f7d9c65f9-9sd7s:/# influx
Connected to http://localhost:8086 version 1.8.6
InfluxDB shell version: 1.8.6
> create user admin with password 'password' with all privileges
> exit
root@influxdb-5f7d9c65f9-9sd7s:/# exit
exit

创建Secret

apiVersion: apps/v1
kind: Secret
metadata:
name: chronograf-secret
type: Opaque
stringData:
username: admin
password: password

这里直接使用了stringData而不是data,这样可以直接写,而不需要base64转码一遍,虽然转码一遍更安全一些(感觉也没啥用,毕竟base64并不是个加密算法)。可能最安全的还是直接在命令行创建Secret:

kubectl create secret generic chronograf-secret --from-literal=username='admin' --from-literal=password='password'

为Chronograf添加相应的环境变量

container的env部分改成如下:

env:
# - name: PORT
# value: "8081"
- name: INFLUXDB_URL
value: "http://influxdb:8086"
- name: INFLUXDB_USERNAME
valueFrom:
secretKeyRef:
name: chronograf-secret
key: username
- name: INFLUXDB_PASSWORD
valueFrom:
secretKeyRef:
name: chronograf-secret
key: password

kubectl apply -f chronograf.yaml,等待就绪后,通过minikube service chronograf-service进行访问,可以看到生效了:



总结

我们使用探针,为Chronograf的状态提供了更定制化的检测方案,通过startupProbe让其启动后未准备完成时不为READY状态,使得滚动更新的时候不会出现无法访问的情况。

我们使用Secret为Chronograf配置了用户和密码,使得有权限控制时可以正确访问InfluxDb数据库。



推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • k8s+springboot+Eureka如何平滑上下线服务
    k8s+springboot+Eureka如何平滑上下线服务目录服务平滑上下线-k8s版本目录“上篇介绍了springboot+Euraka服务平滑上下线的方式,有部分小伙伴反馈k ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了SpringCloudRibbon部分源码相关的知识,希望对你有一定的参考价值。1:ribbon是提供通过servi ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 标题: ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 1.脚本功能1)自动替换jar包中的配置文件。2)自动备份老版本的Jar包3)自动判断是初次启动还是更新服务2.脚本准备进入ho ... [详细]
  • 服务网关与流量网关
    一、为什么需要服务网关1、什么是服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关& ... [详细]
author-avatar
书友48058773
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有