前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用 Python 优雅地编排 Kubernetes

使用 Python 优雅地编排 Kubernetes

作者头像
netkiller old
发布于 2022-01-14 07:57:22
发布于 2022-01-14 07:57:22
98100
代码可运行
举报
文章被收录于专栏:NetkillerNetkiller
运行总次数:0
代码可运行

你还用 yaml编排 kubernetes 吗?你是否意识到YAML的局限性,例如你无法定义变量,不能循环重复内容,不能跟高级语言互动,于是你转向了 HELM, helm 提供模版技术,可以在模版中实现包含引用,定义变量,循环等等操作,但也仅此而已。

YAML 和 HELM 方案更多是给运维人员准备的,对开发并不友好,那么有没有更好的解决方案呢?

来看看我用 python 写的一个工具吧 netkiller-devops

安装方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install netkiller-devops

下面编排一个 nginx 给大家演示一下。运行环境使用 macOS + k3d

k3s 是由 Rancher Labs 推出的一款轻量级 Kubernetes 发行版,满足在边缘计算环境中运行在 x86、ARM64 处理器上的小型、易于管理的 Kubernetes 集群日益增长的需求。

k3s 除了在边缘计算领域的应用外,在研发侧的表现也十分出色。我们可以快速在本地拉起一个轻量级的 k8s 集群,而 k3d 则是 k3s 社区创建的一个小工具,可以在一个 docker 进程中运行整个 k3s 集群,相比直接使用 k3s 运行在本地,更好管理和部署。

安装 k3d

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
brew install k3d

启动集群

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
k3d cluster create mycluster --api-port 6443 --servers 1 --agents 1 --port '80:80@loadbalancer' --port '443:443@loadbalancer'    

现在创建一个 python 文件 例如 nginx.py 把下面内容复制进去

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os, sys

module = os.path.dirname(
    os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
print(module)
sys.path.insert(0, module)
from netkiller.kubernetes import *

namespace = Namespace()
namespace.metadata.name('development')
namespace.metadata.namespace('development')
# namespace.debug()

service = Service()
service.metadata().name('nginx')
service.metadata().namespace('development')
service.spec().selector({'app': 'nginx'})
service.spec().type('NodePort')
service.spec().ports([{
    'name': 'http',
    'protocol': 'TCP',
    'port': 80,
    'targetPort': 80
}])


deployment = Deployment()
deployment.apiVersion('apiVersion: apps/v1')
deployment.metadata().name('nginx').labels({'app': 'nginx'}).namespace('development')
deployment.spec().replicas(2)
deployment.spec().selector({'matchLabels': {'app': 'nginx'}})
deployment.spec().template().metadata().labels({'app': 'nginx'})
deployment.spec().template().spec().containers().name('nginx').image(
    'nginx:latest').ports([{
        'containerPort': 80
    }])
# deployment.debug()
# # deployment.json()
ingress = Ingress()
ingress.apiVersion('networking.k8s.io/v1')
ingress.metadata().name('nginx')
ingress.metadata().namespace('development')
ingress.metadata().annotations({'ingress.kubernetes.io/ssl-redirect': "false"})
ingress.spec().rules([{
    # 'host': 'www.netkiller.cn',
    'http': {
        'paths': [{
            'path': '/',
            'pathType': 'Prefix',
            'backend': {
                'service': {
                    'name': 'nginx',
                    'port': {
                        'number': 80
                    }
                }
            }
        }]
    }
}])
# ingress.debug()
compose = Compose('development')
compose.add(namespace)
compose.add(service)
compose.add(deployment)
compose.add(ingress)
# compose.debug()
# compose.yaml()
# compose.save('/tmp/test.yaml')

kubernetes = Kubernetes()
kubernetes.compose(compose)
# kubernetes.debug()
# print(kubernetes.dump())
kubernetes.main()

查看帮助信息 /usr/bin/python3 nginx.py -h

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
➜  devops git:(master)/usr/bin/python3 nginx.py -h
Usage: nginx.py [options] <command>

Options:
  -h, --help            show this help message and exit
  -e development|testing|production, --environment=development|testing|production
                        environment
  -l, --list            print service of environment

  Cluster Management Commands:
    -g, --get           Display one or many resources
    -c, --create        Create a resource from a file or from stdin
    -d, --delete        Delete resources by filenames, stdin, resources and
                        names, or by resources and label selector
    -r, --replace       Replace a resource by filename or stdin

  Namespace:
    -n, --namespace     Display namespace
    -s, --service       Display service

  Others:
    --logfile=LOGFILE   logs file.
    -y, --yaml          show yaml compose
    --export            export docker compose
    --debug             debug mode
    -v, --version       print version information

现在开始部署 nginx 使用参数 -c :

/usr/bin/python3 nginx.py -c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
➜  devops git:(master)/usr/bin/python3 nginx.py -c
namespace/development created
service/nginx created
deployment.apps/nginx created
ingress.networking.k8s.io/nginx created

查看部署状态

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
➜  devops git:(master) ✗ kubectl get namespace
NAME              STATUS   AGE
default           Active   3h15m
kube-system       Active   3h15m
kube-public       Active   3h15m
kube-node-lease   Active   3h15m
development       Active   21m

➜  devops git:(master) ✗ kubectl get service -n development
NAME    TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
nginx   NodePort   10.43.19.13   <none>        80:31258/TCP   21m

➜  devops git:(master) ✗ kubectl get deployment -n development
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   2/2     2            2           21m

➜  devops git:(master) ✗ kubectl get ingress -n development
NAME    CLASS    HOSTS   ADDRESS                 PORTS   AGE
nginx   <none>   *       172.23.0.2,172.23.0.3   80      21m

检验 nginx 启动情况

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
➜  devops git:(master) ✗ curl http://localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

我们可以看到反馈结果,现在开大 Safari 看看效果

一切跟预料的一样,我们成功了,Yeah!!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Netkiller 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Zookeeper客户端kazoo的watch流程详解
根据我在zk的通信协议中提到的,GetData请求的参数中如果watch为1,则表示客户端希望收到zk的数据监控回调 而这里就是带了watch=1.
tunsuy
2022/10/27
6960
【Zookeeper】Apach Curator 框架源码分析:初始化过程(一)【Ver 4.3.0】
Curator是netflix公司开源的一套zookeeper客户端,目前是Apache的顶级项目。
阿东
2023/09/02
6790
【Zookeeper】Apach Curator 框架源码分析:初始化过程(一)【Ver 4.3.0】
zookeeper使用详解(命令、客户端、源码)
  zookeeper我们常用来做分布式协调中间件,很多时候我们都接触不到它的原理和用法,我对他的了解也仅限于知道它可以做分布式协调、配置管理、分布式锁,并且有个watch节点监听常常能听到。接下来我要系统的学下zookeeper的功能和原理,一起走进zookeeper的世界
老梁
2019/09/10
2.5K0
zookeeper使用详解(命令、客户端、源码)
zookeeper源码分析(2)-客户端启动流程
客户端的入口,负责启动整个客户端。持有ClientCnxn和ZKWatchManager的实例,提供了客户端对节点操作的方法。
Monica2333
2020/06/22
9540
python codis集群客户端(二) - 基于zookeeper对实例创建与摘除
 在这一篇中我们实现了不通过zk来编写codis集群proxys的api, 如果codis集群暴露zk给你的话,那么就方便了,探活和故障摘除与恢复codis集群都给你搞定了,你只需要监听zookeeper中实例的状态就好了。 下面看我的实现。 1、CodisByZKPool.py 这里通过zk读取并初始化pool_shards,简单说一下如何故障摘除和恢复 1)我们监听zk中节点状态改变,当发现某个实例对应的节点状态变化了,比如DELETE了,那么我们认为这个实例挂了,我们就会重新_create_pool刷
用户1225216
2018/03/05
1.8K2
Python 基于python操纵zookeeper介绍
kazoo-2.6.1-py2.py3-none-any.whl(windows)
授客
2019/09/10
1.3K0
Python 基于python操纵zookeeper介绍
Kazoo Python Zookeeper 选主
本文讲述基于zookeeper选主与故障切换的方法。我们的例子使用的是python。 使用的库是kazoo,安装方式 pip install kazoo  应用场景: 多个实例部署,但不是“去中心化”的部署方式; 有且只有一个节点作为master,履行master的职责,在例子中是注册调度器; 其他实例作为slave,不提供调度功能,但是在master节点挂掉之后,可以重新进行选主调度。 1、注册调度器 我们只给出伪代码,简单的打印调度器注册结果。 # -*- coding:utf-8 -*- # 调度
用户1225216
2018/03/05
1.9K2
【Zookeeper】Apach Curator 框架源码分析:初始化过程
Curator是netflix公司开源的一套zookeeper客户端,目前是Apache的顶级项目。和ZK的原生客户端相比,Curator的抽象层次要更高,同时简化了ZK的常用功能开发量,比如Curator自带连接重试、反复注册Watcher、NodeExistsException 异常处理等等。
阿东
2023/07/10
1.5K0
【Zookeeper】Apach Curator 框架源码分析:初始化过程
深入分析 Watcher 机制的实现原理(三)客户端接收服务端处理完成的响应及事件触发
服 务 端 处 理 完 成 以 后 , 会 通 过NettyServerCnxn.sendResponse 发送返回的响应信息, 客户端会在 ClientCnxnSocketNetty.messageReceived 接收服务端的返回
周杰伦本人
2022/10/25
1.2K0
深入分析 Watcher 机制的实现原理(三)客户端接收服务端处理完成的响应及事件触发
深入浅出Zookeeper源码(四):Watch实现剖析
用过zookeeper的同学都知道watch是一个非常好用的机制,今天我们就来看看它的实现原理。
泊浮目
2023/12/25
2370
Zookeeper的通信协议详解
基于TCP/IP协议,zk实现了自己的通信协议来完成客户端与服务端,服务端与服务端之间的网络通信,zk的通信协议整体上的设计非常简单,
tunsuy
2022/10/27
1K0
zookeeper源码分析(9)-Curator相关介绍
zookeeper常用的Java客户端有三种:zookeeper原生的、Apache Curator、开源的zkclient。Curator官网上这么说
Monica2333
2020/06/22
2.4K0
Zookeeper Python调用
安装:pip install kazoo 1、链接 from kazoo.client import KazooClient
用户5760343
2019/10/29
7180
Zookeeper 通知更新可靠吗? 解读源码找答案!
遇到Keepper通知更新无法收到的问题,思考节点变更通知的可靠性,通过阅读源码解析了解到zk Watch的注册以及触发的机制,本地调试运行模拟zk更新的不可靠的场景以及得出相应的解决方案。
特鲁门
2018/07/17
3.4K12
Zookeeper入门(三)—使用CuratorFramework操作节点并添加监视器
在上一篇文章ZooKeeper入门(二)中笔者讲解了分布式协调中间件ZooKeeper的常用命令并使用Curator客户端实现了一个简单的配置中心功能。本文的目的就是带领读者朋友们一起学习如何在SpringBoot项目中使用Curator客户端对ZooKeeper节点进行简单的增删改查并对节点设置Watcher监视器等实践,让大家掌握使用Curator客户端对ZooKeeper进行基础的操作。
用户3587585
2022/11/22
3.7K0
深入分析 Watcher 机制的实现原理(一)客户端注册watcher
在创建一个 ZooKeeper 客户端对象实例时,我们通过new Watcher()向构造方法中传入一个默认的 Watcher, 这 个 Watcher 将作为整个 ZooKeeper 会话期间的默认Watcher,会一直被保存在客户端 ZKWatchManager 的defaultWatcher 中
周杰伦本人
2022/10/25
9930
深入分析 Watcher 机制的实现原理(一)客户端注册watcher
Python与ZooKeeper集群连接
由于项目的需要,需要学习Python客户端连接ZooKeeper集群,并实现创建临时节点、获得指定的路径下的信息、监听子节点变化的功能。
py3study
2020/01/08
1.8K0
Netty + ZooKeeper 实现简单的服务注册与发现
最近的一个项目:我们的系统接收到上游系统的派单任务后,会推送到指定的门店的相关设备,并进行相应的业务处理。
fengzhizi715
2019/06/17
1.4K0
Zookeeper详解(十):Pytho
关于Watcher,网上很多帖子都是通过装饰器的方式实现的,其实我上面的方式和装饰器是一样的,只是形式不同罢了。功能都能实现,只是用装饰器有时候会不方便。
py3study
2020/01/07
8750
进阶分布式系统架构系列:Zookeeper 监听机制
当今时代,发布订阅场景到处可见,像微信中的公众号消息订阅,或者网购场景下库存消息的订阅通知等等,这些都是属于发布订阅的场景。
民工哥
2023/08/25
4890
进阶分布式系统架构系列:Zookeeper 监听机制
推荐阅读
相关推荐
Zookeeper客户端kazoo的watch流程详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验