Loading [MathJax]/jax/input/TeX/config.js
前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
你还在用YAML编排K8s吗?看看这篇吧
由于 YAML的局限,它是配置文件,不够灵活,所以我便写了这个程序,目前还没有进入 Release 阶段。等我用一段时间,稳定了,就会升级。
netkiller old
2021/10/20
4930
安装kubernetes集群
其中,PWK 是试验性质的免费的 Kubernetes 集群,只要有 Docker 或者 Github 账号就可以在浏览器上一键生成 Kubernetes 集群。但是它有诸多限制,例如一次只能使用 4 个小时,并且有扩展性和性能等问题。所以 PWK 一般只用于教学或者试验。
Michel_Rolle
2023/11/23
3K0
kubernetes-ingress(十)
https://kubernetes.io/docs/concepts/services-networking/ingress/
yuezhimi
2020/09/30
5390
kubernetes-ingress(十)
本地计算机上使用轻量级Kubernetes - k3s
如何在工作站上启动并运行轻量级 Kubernetes。K3s 是一种轻量级、经过认证的 Kubernetes 发行版,专为资源受限的环境(例如边缘设备、物联网设备和小规模部署)而设计。它由 Rancher Labs 开发,构建的目标是提供一个简约且易于使用的 Kubernetes 发行版,消耗更少的资源,同时保持与 Kubernetes API 的完全兼容性。
DevOps云学堂
2023/12/04
5180
本地计算机上使用轻量级Kubernetes - k3s
Kubernetes服务访问
通过 Deployment 来创建一组 Pod 来提供具有高可用性的服务。虽然每个 Pod 都会分配一个单独的 Pod IP,然而却存在如下两个问题:
cuijianzhe
2022/06/14
6780
Kubernetes服务访问
Gitlab CICD 与Kubernetes实践·部署GitLab
上一篇,简单的从?Gitlab CI/CD方法论中探索实践中大致了解Gitlab在CI/CD功能的基本介绍,现在我们通过在K8s集群内安装Gitlab、Gitlab Runner来为深入探索Gitla
公众号: 云原生生态圈
2020/11/02
2.4K0
Gitlab CICD 与Kubernetes实践·部署GitLab
一文搞懂 K3D
尽管 Kubernetes 是为在云中运行而构建的,然而,在实际的业务场景中,开发人员出于各种原因需要在其本地计算机上部署及运行它。毕竟,在本地运行往往是一种使用容器编排平台的最为简单模式。基于本地开发环境,能够尽可能以减轻与生产环境的差异,并确保应用程序在生产中有效运行。
Luga Lee
2022/03/25
3.5K0
一文搞懂 K3D
将 Python 项目部署到容器
Flask 是一个轻量级Web应用框架,简单易用,可以很快速地创建web应用。我们用它来创建一个demo应用。
netkiller old
2021/07/23
1.7K0
kubernetes 上手指南:概念篇
今天的主题:kubernetes 概念篇,通过一些示例,学习 kubernetes(k8s) 的一些核心概念。
谢伟
2019/12/13
7920
kubernetes—Service介绍
在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。
Alone-林
2023/03/17
6800
kubernetes—Service介绍
kubernetes-traefik(二十一)
使用nginx作为前端负载均衡,通过ingress controller不断的和kubernetes api交互,实时获取后端service,pod等的变化,然后动态更新nginx配置,并刷新使配置生效,达到服务发现的目的。
yuezhimi
2020/09/30
5090
使用K3S创建本地开发集群
用过minikube, VM启动比较慢, 而且下载最新版的时候, 阿里云的mirror都没有最新版本的镜像, 导致一直启动不起来. 非常难受.
东风微鸣
2022/04/21
1.7K0
使用K3S创建本地开发集群
kubernetes Ingress Nginx Controller
克隆ingress-nginx-controller 仓库到本地 实验使用版本: https://github.com/opsenv/ingress-nginx 官方仓库地址: https://github.com/kubernetes/ingress-nginx fork仓库地址到opsenv下 部署的清单文件在deploy目录下,修改的配置清单已经在https://github.com/opsenv/ingress-nginx 下的deploy目录下 因为国内拉取ingress-nginx-cont
公众号: 云原生生态圈
2021/11/15
4970
kubernetes Ingress Nginx Controller
kubernetes中常用的Ingress Controller
到https://github.com/kubernetes/ingress-nginx/tree/master/deploy/static这个下面下载对应的YAML文件,有configmap.yaml,namespace.yaml,rbac.yaml,with-rbac.yaml,可以写一个如下循环下载:
极客运维圈
2020/02/04
1.8K0
kubernetes中常用的Ingress Controller
使用 K3s 和 Traefik 创建本地开发集群
完整的 Kubernetes 集群往往非常复杂,需要较高的资源,往往我们在开发期间需要一个完整的 Kubernetes 来运行我们的应用,但是并不要求达到生产级别的集群,本文我们将探讨几种本地轻松配置 Kubernetes 集群的方法。
我是阳明
2020/11/03
2.3K0
使用 K3s 和 Traefik 创建本地开发集群
使用 Python 优雅地编排 Dockerfile​
docker compose 是 docker 的容器编排工具,它是基于 YAML 配置,YAML 是一种配置文件格式,支持传递环境变量,但是对于复杂的容器编排显得力不从心。
netkiller old
2021/12/27
9030
GitLab CICD与Kubernetes实践·部署Flask Web服务
上篇?Gitlab CICD 与Kubernetes实践·部署GitLab Runner文章内通过Kubernetes已经完成Gitlab Runner的部署的,现在我通过一个实际的案例来测试和使用G
公众号: 云原生生态圈
2020/11/02
2.1K0
GitLab CICD与Kubernetes实践·部署Flask Web服务
K3S 入门级实战教程,和 K8S 有何不同?
我们知道 Kubernetes(或 K8s)是用于管理容器化工作负载和服务的便携式开源平台。它有助于在集群中编排和管理 pod 中的应用程序。它还有效地改进了任务,例如重新部署的零停机时间或容器的自我修复。
我的小碗汤
2023/03/20
1.4K0
K3S 入门级实战教程,和 K8S 有何不同?
08 . Kubernetes之 ingress及Ingress Controller
Ingress规则是很灵活的,可以根据不同域名,不同path转发请求到不同的service,并且支持https/http.
iginkgo18
2020/09/27
3.2K0
08 . Kubernetes之 ingress及Ingress Controller
kubernetes-服务发现service(九)
•防止Pod失联     •定义一组Pod的访问策略     •支持ClusterIP,NodePort以及LoadBalancer三种类型     •Service的底层实现主要有iptables和ipvs二种网络模式
yuezhimi
2020/09/30
5650
相关推荐
你还在用YAML编排K8s吗?看看这篇吧
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档