当前位置:首页 > 每日看点

你是怎么使用K8s的?

卡卷网2年前 (2024-12-17)每日看点277

从简单的golang服务器一步一步组成一个k8s的高可用的应用

kubernetes学习记录

本地目录实现持久化存储

容器是无状态的,每次重启都是新的进程,但是我们需要将一些状态数据如配置、用户数据等存到本地来方便新的容器可以拿到历史状态。先创建一个目录来存放数据,并且挂载到minikube虚拟机内(不是pod里面)。注意要新开一个终端来调用,这个命令会阻塞,不能中断。

=> mkdir storage => minikube mount storage:/data

可以测试一下是否成功了

=> echo aaa > storage/test.txt => minikube ssh 'cat /data/test.txt' aaa

然后创建一个持久化存储卷(PersistentVolume)的配置,挂载本机目录,注意是minikube虚拟机的目录,所以是/data

apiVersion: v1 # 版本信息 kind: PersistentVolume # 这个是一个持久化存储卷 metadata: name: test-local-pv # 元数据定义名称 spec: capacity: storage: 1Ki # 定义容量1KB,定义不定义都一样,因为目录挂载的方式取决于原始目录的容量 storageClassName: local # 定义这个为了和pvc匹配,否则会绑定不了 persistentVolumeReclaimPolicy: Retain # pvc被删除时,pv的回收策略,retain为保留pv,手动清理 accessModes: - ReadWriteMany # 表示该卷可以被多个节点以读写的方式挂载。这意味着多个 Pod 可以同时访问这个卷并进行读写操作。 hostPath: path: /data

pv是不能直接给pod访问和挂载使用的,需要使用pvc才能给到pod使用,所以写一个pvc的配置

apiVersion: v1 # 版本 kind: PersistentVolumeClaim # pvc类型,请求持久化存储卷 metadata: name: test-local-pvc spec: accessModes: - ReadWriteMany # 这个模式表示多个节点可以同时读写这个存储。 resources: requests: storage: 1Ki # 要和pv匹配,不然会无法绑定 volumeName: test-local-pv # 指定要绑定的pv的名字 storageClassName: local # 同样要和pv一致

启动pv和pvc,要看一下是否启动和绑定成功

kubectl apply -f test-pv.yaml kubectl apply -f test-pvc.yaml

pv和pvc的绑定关系使用describe看起来会更清晰一点

kubectl describe pv test-local-pv kubectl describe pvc test-local-pvc

你是怎么使用K8s的?  第1张

你是怎么使用K8s的?  第2张

可以看到pv和pvc绑定成功

下面要修改一下test.go,让我们的服务端可以读取和写入存储的一个文件

package main import ( "fmt" "io/ioutil" "net/http" "os" ) func main() { fmt.Println("start main") hostName := os.Getenv("HOSTNAME") // 正常请求根目录读取这个文件返回内容 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { contentBytes, err := ioutil.ReadFile("/data/test.txt") outStr := "" if err != nil { outStr = err.Error() } else { outStr = string(contentBytes) } fmt.Fprintf(w, "hello, world, %s, txt: '%s'\n", hostName, outStr) }) // 保存文件,取xxx:xxx/save?content=xxx来存入 http.HandleFunc("/save", func(w http.ResponseWriter, r *http.Request) { r.ParseForm() tmp := r.Form["content"] inputText := "" if len(tmp) > 0 { inputText = tmp[0] } ioutil.WriteFile("/data/test.txt", []byte(inputText), 0644) fmt.Fprintf(w, "%s", inputText) }) http.HandleFunc("/exit", func(w http.ResponseWriter, r *http.Request) { fmt.Println("recieve exit, bye!") os.Exit(0) }) err := http.ListenAndServe(":7878", nil) if err != nil { panic(err) } os.Exit(0) }

修改完重新做一个镜像加载到minikube中,然后要修改一下deployment的配置来让pod使用pvc作为存储

apiVersion: apps/v1 # 版本,虽然不知道为什么,但是要写apps/v1 kind: Deployment # 选deployment metadata: name: test-dep # 给deployment定义名字,创建的pod会以此为前缀 spec: # deployment的要求 strategy: type: RollingUpdate # 策略为滚动更新 rollingUpdate: maxUnavailable: 1 # 最多只能停止1个pod maxSurge: 1 # 在更新过程中,最多可以多创建多少个 Pod,本身停止了1个,创建1个,这里设置1会停1个创建2个 replicas: 3 # pods启动3个 selector: # 定义deployment管理的pod选择器 matchLabels: # 要跟下面的template中一样,不一样会报错 app: test template: # 定义deployment管理的pod metadata: labels: # 定义标签,要和deployment中一样 app: test spec: # pod的定义 volumes: # 定义要求的存储卷 - name: test-volume # 起个名字给pod使用 persistentVolumeClaim: # 对应的pvc claimName: test-local-pvc containers: - name: test image: test-con:latest imagePullPolicy: Never # 使用本地镜像,不从远端拉取 command: ["go"] args: ["run", "/root/test.go"] volumeMounts: # 挂载到当前容器 - mountPath: /data # 挂载目录 name: test-volume # 使用的volumes,是上面定义的名字 readinessProbe: # 就绪探针,什么时候可以开始接收流量,不会重启pod httpGet: path: / port: 7878 timeoutSeconds: 1 # 探测超时时间5s initialDelaySeconds: 5 # 第一次探测的等待时间 periodSeconds: 5 # 探测周期 livenessProbe: # 存活探针,什么时候需要杀掉这个pod,如果启动一直失败就会杀掉pod重启一个 httpGet: path: / port: 7878 timeoutSeconds: 1 # 探测超时时间5s initialDelaySeconds: 20 # 第一次探测的等待时间 periodSeconds: 5 # 探测周期 failureThreshold: 10 # 错误阈值,超过这个阈值将会重启pod

生效一下这个配置文件,查看pod的pvc使用情况

kubectl apply -f test-dep.yaml

查看pvc里面更能看出来挂载情况

kubectl describe pvc test-local-pvc

你是怎么使用K8s的?  第3张

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2024/12/4780.html

分享给朋友:

相关文章

五个私藏宝贝网站!上班族摸鱼必备,打造快乐小天地

五个私藏宝贝网站!上班族摸鱼必备,打造快乐小天地

有朋友提到,虽然一整天都在“摸鱼”,但却感觉身心俱疲,甚至比一直忙碌工作还要累。其实这背后是有科学依据的。当人专注于工作时,会进入一种“心流”状态,这种状态让人感到兴奋、满足且充实。相反,如果在工作时分心“摸鱼”,会导致注意力分散,增加认知…

你是如何在不依靠工资收入的情况下赚到一万元的?

你是如何在不依靠工资收入的情况下赚到一万元的?

分享几个路子稳,门槛低,变现快,适合年轻人的靠谱的副业。绝对不是送外卖、滴滴、搬砖等等的苦力活,这几个副业都是能是性价比极高,还能让你快速成长的工作。 想通过副业实现暴富、立马月入过万的同学,建议速速划走。 今天撇哥就给大家分享 100+个…

为什么小公司留不住人?

为什么小公司留不住人?

我估计,整个知乎,可能没有比我公司再小得了,。。 正对面就是我唯一的一个员工的工位。 为啥留不住人。因为那些留不住人的老板,太拿自己当回事。 大公司靠制度。小公司靠人情。 我这儿的业务,因为全都是线上,所以员工来不来坐班都不重要。 天太…

抖音有3,4万粉丝能挣多少钱?

抖音有3,4万粉丝能挣多少钱?

如果在抖音有100万粉丝,一个月能赚多少钱你知道吗?直接说答案: 抖音有100万粉丝,可能1分钱也赚不到...那视频有100万点赞,能赚多少钱?可能也是1分钱都赚不到... 新手需要通过抖音变现 [文章: 做为新手玩抖音要注意什么?怎样才能…

SWITCH销量会破亿吗?

SWITCH销量会破亿吗?

不可能破亿的。 能过5000万就了不起了。 我觉得是过不了5000万这条线的,要是过了的话,每过100万我在这个回答里更新一个任天堂游戏人物的画像。 愿赌服输。 5100万突破的马里奥 5200万突破的碧琪公主 财报更新了,目前55…

为什么网易云音乐越做越烂了?

还记得当年周杰伦专辑授权到期的最后一天,他来个一次性打包买断给歌迷,结果歌迷花钱买完了,第二天授权到期,不能听了。 这种下三滥的操作,我不知道是哪个群体这么多年一直在吹网易云音乐。 一堆没有授权的英文歌,一堆民间翻唱的歌,他是怎么有脸搞付费…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。