Skip to content

第17章-Go-Python部署到K8S

本章所讲内容:

17.1 编写Go代码

17.2 将Go项目发布到K8S集群

17.3 将Python代码发布到k8s集群

17.4 Python实现K8S API二次封装

17.1 编写Go代码

1、linux机器安装go(我用的是centos7.9操作系统)

[root@xuegod63 ~]# yum install go -y

2、创建源码文件

[root@xuegod63 ~]# mkdir test

[root@xuegod63 ~]# cd test/

[root@xuegod63 test]# cat main.go

package main

import (

"net/http"

"github.com/gin-gonic/gin"

)

func main() {

// 创建Gin引擎

router := gin.Default()

// 定义路由和处理程序

router.GET("/", func(c *gin.Context) {

​ c.JSON(http.StatusOK, gin.H{

​ "message": "Hello, World!",

​ })

})

// 运行Gin应用

router.Run(":8080")

}

3、Go mod初始化项目

[root@xuegod63 test]# go mod init test

#设置代理

[root@xuegod63 test]# go env -w GOPROXY=https://goproxy.cn,direct

[root@xuegod63 test]# go mod tidy

#构建源码

[root@xuegod63 test]# CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o k8s-demo main.go

17.2 将Go项目发布到K8S集群

1、编写dockerfile文件

[root@xuegod63 test]# cat Dockerfile

FROM alpine

WORKDIR /data/app/

COPY k8s-demo /data/app/

CMD ["/bin/sh","-c","./k8s-demo"]

2、构建镜像

[root@xuegod63 test]# docker build -t xuegod/k8sdemo:v1 .

3、打包镜像,传到k8s工作节点

[root@xuegod63 test]# docker save -o k8sdemo.tar.gz xuegod/k8sdemo:v1

[root@xuegod63 test]# scp k8sdemo.tar.gz xuegod64:/root/

#在xuegod64节点解压镜像

1)使用docker容器运行时用如下命令导出镜像

[root@xuegod64 ~]# docker load -i k8sdemo.tar.gz

2)使用containerd容器运行时用如下命令导出镜像

[root@xuegod64 ~]# ctr -n=k8s.io images k8sdemo.tar.gz

4、创建deployment的yaml文件

[root@xuegod63 test]# cat k8s.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: k8s-demo

namespace: default

labels:

​ app: k8s-demo

spec:

selector:

​ matchLabels:

​ app: k8s-demo

replicas: 2

template:

​ metadata:

​ labels:

​ app: k8s-demo

​ spec:

​ containers:

​ - image: xuegod/k8sdemo:v1

​ imagePullPolicy: IfNotPresent

​ name: k8s-demo

​ ports:

​ - containerPort: 8080

​ protocol: TCP

​ resources:

​ limits:

​ cpu: 100m

​ memory: 100Mi

​ requests:

​ cpu: 50m

​ memory: 50Mi

​ livenessProbe:

​ tcpSocket:

​ port: 8080

​ initialDelaySeconds: 10

​ timeoutSeconds: 3

​ readinessProbe:

​ httpGet:

​ path: /

​ port: 8080

​ initialDelaySeconds: 10

​ timeoutSeconds: 2

---

apiVersion: v1

kind: Service

metadata:

name: k8s-demo-svc

namespace: default

labels:

​ app: k8s-demo

spec:

ports:

​ - name: api

​ port: 8080

​ protocol: TCP

​ targetPort: 8080

selector:

​ app: k8s-demo

#更新yaml文件

[root@xuegod63 test]# kubectl apply -f k8s.yaml

#查看pod和svc

[root@xuegod63 test]# kubectl get pods

NAME READY STATUS RESTARTS AGE

k8s-demo-55bc47f86-262z2 1/1 Running 0 76s

[root@xuegod63 test]# kubectl get svc

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

k8s-demo-svc ClusterIP 10.111.184.94 8080/TCP 77s

kubernetes ClusterIP 10.96.0.1 443/TCP 36m

#修改svc的type类型变成nodePort

[root@xuegod63 test]# kubectl edit svc k8s-demo-svc

[root@xuegod63 test]# kubectl get svc

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

k8s-demo-svc NodePort 10.111.184.94 8080:31158/TCP 3m3s

kubernetes ClusterIP 10.96.0.1 443/TCP 38m

浏览器访问测试:访问xuegod63 ip:31158

[root@xuegod63 test]# cat go-ingress.yaml

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

name: go-ingress

namespace: default

spec:

ingressClassName: nginx

rules:

- host: go.xuegod.cn

http:

paths:

- path: /

​ pathType: Prefix

​ backend:

​ service:

​ name: k8s-demo-svc

​ port:

​ number: 8080

17.3 将Python项目发布到K8S集群

1、获取应用程序代码

把hello-python.tar.gz压缩包上传到k8s控制节点xuegod63的root下,手动解压

[root@xuegod63]#tar zxvf hello-python.tar.gz

[root@xuegod63]#cd /root/hello-python/app

备注:equirements.txt文件包含main.py所需的包列表,pip将使用它来安装Flask库。

2、创建dockerfile

[root@xuegod63 app]#docker load -i python.tar.gz

[root@xuegod63 app]# cat dockerfile

FROM python:3.7

WORKDIR /app

ADD . /app/

RUN /usr/local/bin/python -m pip install --upgrade pip

RUN pip install -r requirements.txt

EXPOSE 5000

CMD ["python","/app/main.py"]

3、构建镜像

[root@xuegod63 app]# docker build -t hello-python:v1 .

4、把镜像做成离线包

[root@xuegod63 app]# docker save -o hello-python.tar.gz hello-python:v1

[root@xuegod63 app]# scp hello-python.tar.gz xuegod64:/root

1)使用docker容器运行时用如下命令导出镜像

[root@xuegod64 ~]# docker load -i hello-python.tar.gz

2)使用containerd容器运行时用如下命令导出镜像

[root@xuegod64 ~]# ctr -n=k8s.io images hello-python.tar.gz

5、创建yaml文件

[root@xuegod63 app]# cat deployment.yaml

apiVersion: v1

kind: Service

metadata:

name: python-service

spec:

selector:

app: hello-python

ports:

- protocol: "TCP"

port: 6000

targetPort: 5000

type: NodePort

---

apiVersion: apps/v1

kind: Deployment

metadata:

name: python

spec:

selector:

matchLabels:

app: python

replicas: 1

template:

metadata:

labels:

​ app: python

spec:

containers:

- name: python

​ image: hello-python:v1

​ imagePullPolicy: IfNotPresent

​ ports:

​ - containerPort: 5000

[root@xuegod63 app]# kubectl apply -f deployment.yaml

[root@xuegod63 app]# cat python-ingress.yaml

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

name: python-ingress

namespace: default

spec:

ingressClassName: nginx

rules:

- host: python.xuegod.cn

http:

paths:

- path: /

​ pathType: Prefix

​ backend:

​ service:

​ name: python-service

​ port:

​ number: 6000

6、访问python代码

[root@xuegod63 app]# kubectl get svc

NAME TYPE CLUSTER-IP PORT(S) AGE

hello-python-service NodePort 10.109.231.42 6000:32588TCP 76m

浏览器访问192.168.1.63:32588即可

17.4 Python实现K8S API二次封装

1、Windows安装Python

1,浏览器访问-à

https://www.python.org/downloads/

出现如下界面:

我们从上图可以看到python最新的版本是3.8.3,我这里使用3.7.2的版本,大家跟我的版本保持一致就可以了,因为这些版本基本差别不大,所以最好跟我保持一致

2.选中上面箭头标注的Downloads,出现如下界面,

在Looking for a specific release?下面找到对应的版本3.7.2

选中,跳转到如下界面:

我们在Files处选择Windows x86-64 executable installer,出现如下:

保存文件即可,这个就是windows下的可执行文件,大家可以忽略下载的步骤,我已经把安装包放到附件了,大家可从附件下载即可。

3.配置python

1)双击下载好的软件,或者选中并右击下载好的软件,在弹出的对话框选择打开选项,可以看到下图1所示界面。底部的第一个复选框默认自动勾选,保持勾选状态即可,Add Python3.7 to PATH复选框默认不勾选,可以将python的安装路径添加到环境变量中,勾选后,后面可省去该步骤,如果希望将python安装到指定路径下,就单击Customize installation如果单击Install Now,系统会直接安装Python,并安装到默认路径下(我们习惯上需要安装到自己指定的目录下)

图1

2)单击Customize installation后,会看到下图2所示的界面,此处直接单击Next即可

图2

3)单击Next出现下图3所示界面,第一个箭头指向的是系统默认的Python安装路径,若需要更改默认的安装路径,则可以点击第二个箭头所指的Browse按钮,点击install安装

图3

4)安装路径没有使用默认路径,我已经将路径修改成了自己的目录了

5)更改安装路径后,单击install按钮,得到下图4所示的界面

图4

6)安装完成后,会得到下图5所示的界面,点击close即可

图5:

验证python是否安装成功:

在开始程序,输入cmd,然后再输入python,跳转到下面界面说明安装成功。

2、安装和配置Pycharm集成环境

Pycharm简介

PyCharm是由JetBrains打造的一款Python IDE。PyCharm用于一般IDE具备的功能,比如, 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制,另外,PyCharm还提供了一些很好的功能用于Django开发,同时支持Google App Engine等,可用于构建大的Python项目,pycharm优点如下:

1)编码协助

其提供了一个带编码补全,代码片段,支持代码折叠和分割窗口的智能、可配置的编辑器,可帮助用户更快更轻松的完成编码工作。

2)项目代码导航

该IDE可帮助用户即时从一个文件导航至另一个,从一个方法至其申明或者用法甚至可以穿过类的层次。若用户学会使用其提供的快捷键的话甚至能更快。

3)代码分析

用户可使用其编码语法,错误高亮,智能检测以及一键式代码快速补全建议,使得编码更优化。

4)Python重构

有了该功能,用户便能在项目范围内轻松进行重命名,提取方法/超类,导入域/变量/常量,移动和前推/后退重构。

5)支持Django

有了它自带的HTML,CSS和 JavaScript编辑器 ,用户可以更快速的通过Django框架进行Web开发。此外,其还能支持CoffeeScript, Mako 和 Jinja2。

6)支持Google App引擎

用户可选择使用Python 2.5或者2.7运行环境,为Google App引擎进行应用程序的开发,并执行例行程序部署工作。

7)图形页面调试器

用户可以用其自带的功能全面的调试器对Python或者Django应用程序以及测试单元进行调整,该调试器带断点,步进,多画面视图,窗口以及评估表达式。

8)集成的单元测试

用户可以在一个文件夹运行一个测试文件,单个测试类,一个方法或者所有测试项目。

Pycharm安装

1)浏览器访问pycharm官网:

https://www.jetbrains.com/pycharm/download/

出现如下界面:

选择Community下的Download,然后选择Direct link可下载以exe结尾的安装包,双击下载的pycharm的安装包即可进行安装

选择课件里的exe文件,pycharm-community-2020.1.3.exe,双击安装即可

3、在Pycharm集成开发环境编写hello word程序

一、编写hello world程序

打开Pycharm,create New Project,创建一个新的Python项目

会看到报错:

点击ok即可,会看到下面界面

File-àNew-à新建一个Python File,命名为hello.py,然后编写hello world程序

print('Hello,world')

#打印的字符串是‘hello world’

看到报错显示No python interpreter configured for project:

需要处理下上面错误:

File-setting—>搜索框输入Project Interpreter—>出现如下界面:

点击show all,出现如下界面:

点击+号,跳转到如下:

把Existiing environment改成自己python安装路径:

点击ok-àok,出现如下界面

点击Apply—>ok

等到所有软件包更新成功之后,按照下面步骤去运行hello world程序

在hello.py上点击右键,点击Run ‘hello’即可把hello world打印出来

4、Python操作K8S API获取资源

python操作kubernetes api需要如下两个条件:

1.前提是需要有个k8s集群环境

2.需要在windows上安装kubernetes模块

在windows下安装kubernetes pip install --ignore-installed kubernetes

或者

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn kubernetes

如果报错: You are using pip version 18.1, however version 22.1.2 is available. You should consider upgrading via the 'python -m pip install --upgrade pip' command.

执行如下命令: python -m pip install --upgrade pip

pip install --ignore-installed kubernetes

或者

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn kubernetes

出现如下,就说明kubernetes模块安装成功了: Successfully installed kubernetes-11.0.

认证:把k8s集群的控制节点上的/root/.kube/config传到自己的电脑指定路径下,我传到了C盘,注意:每个人config文件不一样,大家需要用自己k8s集群控制节点的config文件

写代码:python-k8s-api.py

import kubernetes from kubernetes import client,config config.kube_config.load_kube_config(config_file='C:\config')

#获取CoreV1API版本对象 v1 = client.CoreV1Api()

#列出来k8s中的所有名称空间

for namespace in v1.list_namespace().items: print(namespace.metadata.name)

#列举所有名称空间下的所有service

services=v1.list_service_for_all_namespaces() for svc in services.items: print('%s \t%s \t%s \t%s \n' %(svc.metadata.namespace,svc.metadata.name,svc.spec.cluster_ip,svc.spec.ports))

#列举所有名称空间下的pod资源

pods=v1.list_pod_for_all_namespaces() for i in pods.items: print("%s\t%s\t%s" %(i.status.pod_ip,i.metadata.namespace,i.metadata.name))

#client.AppsV1Api对象可以操作跟k8s中控制器相关资源对象,下面演示的是列举所有名称空间的deployment

v1_deploy=client.AppsV1Api() deploys=v1_deploy.list_deployment_for_all_namespaces() for i in deploys.items: print("%s\t%s\t%s"%(i.metadata.name,i.metadata.namespace,i.spec.replicas))

5、Python操作K8S API创建deployment资源

写代码:python-api-deploy.py

from os import path

import yaml from kubernetes import client,config

#引入我们要用的包 def main(): config.load_kube_config(config_file='C:\config')

#读入集群相关信息,就是要操作哪个集群 with open(path.join(path.dirname(file),"nginx-deploy.yaml")) as f: dep=yaml.safe_load(f) k8s_apps_v1=client.AppsV1Api() resp = k8s_apps_v1.create_namespaced_deployment(body=dep,namespace='default') print('deployment created,name=%s'%(resp.metadata.name))

if name == 'main': main()

6、Python操作K8S API删除k8s资源

写代码:api-delete-k8s.py

from os import path

import yaml

from kubernetes import client,config

def main():

config.load_kube_config(config_file='C:\config')

k8s_core_v1=client.CoreV1Api()

resp=k8s_core_v1.delete_namespaced_pod(namespace='default',name='busybox-test')

print('delete pod')

main()

上面是删除自己linux机器上的k8s集群的默认名称空间下的busybox-test这个pod

7、Python操作K8S API修改k8s资源

写代码:api-modify-k8s.py

from os import path

import yaml

from kubernetes import client,config

def main():

config.load_kube_config(config_file='C:\config')

k8s_core_v1=client.CoreV1Api()

old_resp=k8s_core_v1.read_namespaced_pod(namespace='default',name='busybox-test')

old_resp.spec.containers[0].image='nginx'

#修改镜像

new_resp=k8s_core_v1.patch_namespaced_pod(namespace='default',name='busybox-test',body=old_resp)

print(new_resp.spec.containers[0].image)

if name=='main':

main()

8、Python操作K8S API查看k8s资源

写代码:api-read-k8s.py

** **

from os import path

import yaml

from kubernetes import client,config

def main():

config.load_kube_config(config_file='C:\config')

k8s_core_v1=client.CoreV1Api()

resp=k8s_core_v1.read_namespaced_pod(namespace='default',name='busybox-test')

print('read pod')

# print(resp)

#读取指定的信息

print(resp.spec.containers[0])

print(resp.spec.containers[0].image)

if name=='main':

main()

kubernetes方法对应的github地址:

https://github.com/kubernetes-client/python

总结:

17.1 编写Go代码

17.2 将Go项目发布到K8S集群

17.3 将Python代码发布到k8s集群

17.4 Python实现K8S API二次封装