第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
kubernetes ClusterIP 10.96.0.1
#修改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
kubernetes ClusterIP 10.96.0.1
浏览器访问测试:访问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二次封装