当前位置:首页 > 每日看点 > 正文内容

你是怎么使用K8s的?

卡卷网8个月前 (12-17)每日看点132

从简单的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

分享给朋友:

相关文章

电视参数哪个最重要?

电视参数哪个最重要?

在选择智能电视时,面板类型是一个关键因素。IPS面板以其宽广的视角和出色的色彩还原能力受到青睐,尤其适合日常观看和游戏。尽管可能会有轻微的漏光,但在大多数情况下,这并不影响使用体验。相比之下,VA面板提供更高的对比度和更深的黑色,增强了沉浸...

B 站上有哪些很好的学习资源?

B 站上有哪些很好的学习资源?

前!方!高!能!精选了多位学习Up主,不乏百万粉丝的大V,还有超多珍贵的学习资源推荐。进了小破站,完全不用担心学完了该怎么办?因为根本学不完啊!!!B站的学习干货实在太多了!语言学习葉子先生酱https://space.bilibili.c...

4499 元起的荣耀Magic7 系列实际使用体验怎么样,值得入手吗?

全是软文。。。。。。不过我买了,标准版。为什么买荣耀:屏幕看着舒服,玩游戏选择大屏,超声波指纹解锁。其它,系统、续航、充电、拍照,不是最强,但均衡下来短板都不是很短。其它米OV,IQ、一加,都看了,预算有限,米OV的小屏不感兴趣,OPPO硬...

闲鱼上为什么会有人问都不问直接下单?

我去年卖一个荣耀90,挂的2200,最终成交2137.5元。对方是一个高高壮壮的西北口音,要求的自取。大概我吃过午饭,约了旁边的商场,那里有荣耀售后。见了面,先看了手机,试了好一会儿,各种测试,没问题。然后去了商场二楼的荣耀售后,让人家售后...

如何判断 Java 工程师的基础知识是否扎实?

我来给你出几道大题,能答对70%,你就算基础扎实了。第一部分 Java基础(27)1. 程序本质:代码是如何被执行的?CPU、操作系统、虚拟机各司何职?2. 基础语法:从CPU角度看变量、数组、类型、运算、跳转、函数等语法3. 引用类型:同...

腾讯云为何在云服务市场败给了阿里云?

IDC领域,2010年以前,万网、新网互联、新网,三家公司瓜分天下,其中万网市场份额最高,排名第一。当时,万网的域名是http://www.net.cn,通过该域名就可以判断万网的地位。2010年阿里云成立,直接收购了万网,大量用户直接流向...

发表评论

访客

看不清,换一张

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