ubuntu server 22.04使用minikube(k8s 1.28.3)在国内环境快速搭建awx operator(2.8.0)测试平台

一、任务背景

在项目开发时为了快速测试应用代码与awx平台web接口实际交互情况,需要在开发环境快速部署一套awx平台代码并启动运行,最新版awx官方推荐使用k8s pod部署而非docker单体容器,由于完整k8s集群搭建通常需要多个节点构成master与node分工,个人电脑性能不足以支撑大量虚拟机运行,此时用轻量化k8s环境部署平台容器镜像可简化工作,常见有k3s和minikube,本文整理了基于minikube部署awx operator 2.8.0镜像的关键步骤,以及当中涉及到国外镜像站拉取资源的一些处理方法。

二、基础环境清单

部署测试平台各项基础环境如下:

  • ubuntu 22.04 LTS server amd64(使用VMware运行1个该Linux系统实例)
    • CPU:2个,单核
    • 内存:4GB
    • 磁盘:不低于40GB(如果采用了LVM部署,文件系统容量不够还可以对虚拟机挂盘扩容)
    • 文件系统:ext4
    • 系统内核版本:Linux 5.15.0-91-generic (无GUI)
    • 网络:虚机实例以NAT模式运行,但安装操作系统时手工设定了静态ipv4地址
      • Ipv4地址:192.168.20.184/24
      • 网关地址:192.168.20.2
    • shell:bash 5.1.16
  • docker-ce 容器引擎,版本 24.0.7
  • minikube 版本 1.32.0
    • k8s 配套版本 1.28.3
    • ingress nginx 配套版本 1.9.3
  • awx operator 镜像版本 2.8.0

整体搭建过程可参考如下教程,但需注意国内网络环境很多资源通过在线下载获取会失败,本文在此基础上增补相关绕行办法:

chrisjhart.com/TLDR-Miniku...

三、clash上网准备

注意:minikube 和 awx operator 在国内网络环境部署无法按照官方预设URL获取到安装包和容器镜像,需要先解决科学上网障碍,个人采用clash作为绕行工具,由读者按照各自实际情况选用相关方案。

clash软件支持在x86 Linux终端shell环境下运行,在运行ubuntu虚拟机实例后,按照clash使用教程在shell环境启动代理服务并保持运行,在本地终端中会看到如下proxy输出提示,下面配置时会用到:

shell 复制代码
...
INFO[0000] RESTful API listening at: 127.0.0.1:9090
INFO[0000] HTTP proxy listening at: 127.0.0.1:7890
INFO[0000] SOCKS proxy listening at: 127.0.0.1:7891
...

四、搭建步骤

注1 :以下涉及Linux shell环境操作,均为非root自建用户发起,需要提权时会加sudo。 注2:minikube镜像管理功能未直接读取docker镜像记录,二者不通用,docker获取的容器镜像需单独注入minikube镜像清单。

4.1 minikube安装&代理配置

执行如下命令,注意curl命令加上选项-x <URL>指向clash服务提供的HTTP proxy地址:

shell 复制代码
cd /tmp/
curl -x http://127.0.0.1:7890 -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
minikube version

修改~/.bashrc文件增加如下配置,注意到minikube在后续安装启动后service默认对宿主机暴露地址为192.168.49.2,将该地址填充至NO_PROXY字段,其他proxy变量内容来自于宿主机clash服务启动后暴露的本地代理服务URL,按照实际情况填入:

properties 复制代码
# add alias for kubectl cmd
alias kubectl='minikube kubectl --'

# add env variables for minikube starting
# proxy URLs from the clash service
export HTTP_PROXY=http://127.0.0.1:7890
export HTTPS_PROXY=http://127.0.0.1:7890
export NO_PROXY=localhost,127.0.0.1,192.168.49.2

编辑完成后执行source令配置修改立即生效:

shell 复制代码
source ~/.bashrc

4.2 docker安装&代理配置

按照docker官方网站提供的指导步骤依次执行即可,截止到本文创建日期,实际最新docker-ce版本为 24.0.7:

docs.docker.com/engine/inst...

创建daemon.json文件,为docker添加国内镜像源下载地址:

shell 复制代码
sudo touch /etc/docker/daemon.json

文件内容如下,以添加网易下载地址为例,可根据实际需求添加其他下载地址:

json 复制代码
{
  "registry-mirrors": ["https://hub-mirror.c.163.com"]
}

用root权限编辑docker服务进程systemd配置文件/etc/systemd/system/multi-user.target.wants/docker.service

shell 复制代码
sudo vim /etc/systemd/system/multi-user.target.wants/docker.service

[Service]版块下增加代理服务URL记录并保存,内容来自上面clash提供的proxy地址:

properties 复制代码
[Service]
...
Environment=HTTP_PROXY=http://127.0.0.1:7890
Environment=HTTPS_PROXY=http://127.0.0.1:7890
Environment=NO_PROXY=localhost,127.0.0.1

重启docker服务令配置文件修改生效,并可观察到proxy信息设定有效:

shell 复制代码
sudo systemctl daemon-reload
sudo systemctl restart docker.service
systemctl show --property=Environment docker

在ubuntu下如果大部分操作采用非root用户执行,则建议将其加入docker用户组,减少后续涉及docker命令的交互必须执行sudo提权:

shell 复制代码
sudo usermod -aG docker <your_username>

4.3 容器镜像铺底

4.3.1 minikube配套ingress插件准备

minikube在首次启动时需要在线下载自身必须容器镜像,在前面设置shell环境变量proxy之后,minikube可借由clash代理自动连接到谷歌官方相关仓库地址完成介质下载并启用,此过程无需再人工介入,但实测发现minikube配套ingress插件无法通过clash代理完成自动下载,需要单独绕行处理。

原始的ingress nginx部署yaml配置单下载地址如下,可将其中controller-<VERSION>改为实际所需的版本,在浏览器中访问后会显示配置单内容(此网站访问也需要搭梯子辅助):

raw.githubusercontent.com/kubernetes/...

下载配置单到本地,个人将其命名为ingress-nginx-aliyun.yml。离线编辑其中image字段,将image: registry.k8s.io/ingress-nginx...字段指向的地址全部修改为国内源地址,这里以阿里镜像源为例,并且镜像命名也有所变化:

保存修改后的yaml配置单并上传到ubuntu服务器备用,一份已修改好的配置单如下: ingress_nginx_aliyun.yml

4.3.2 awx operator相关镜像准备

实测awx operator 2.8.0 Pod运行涉及两个镜像,也无法触发minikube通过clash代理完成自动下载:

借助已配置clash代理的docker引擎手工执行镜像拉取,并将完成拉取的镜像导出为离线tar包:

shell 复制代码
sudo docker pull gcr.io/kubebuilder/kube-rbac-proxy:v0.15.0
sudo docker pull quay.io/ansible/awx-operator:2.8.0
cd /tmp/
sudo docker save gcr.io/kubebuilder/kube-rbac-proxy:v0.15.0 -o kube-rbac-proxy-0.15.0.tar
sudo docker save quay.io/ansible/awx-operator:2.8.0 -o awx-operator-2.8.0.tar

将上述已下载awx相关镜像注入minikube本地镜像管理清单中:

shell 复制代码
cd /tmp/
minikube image load kube-rbac-proxy-0.15.0.tar
minikube image load awx-operator-2.8.0.tar
minikube image list

4.4 minikube集群启动

执行如下命令启动minikube集群,注意不要加上minikube自带--addons=ingress选项:

shell 复制代码
minikube start --cache-images=true --vm-driver=docker 

minikube启动过程结束后,可执行前面alias重命名的kubectl指令检查集群工作状态,此时不含ingress-nginx-xxx命名相关的pod在运行:

shell 复制代码
foo@awx01:~$ kubectl version
Client Version: v1.28.3
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.28.3

foo@awx01:~$ kubectl get pods -A
NAMESPACE       NAME                                               READY   STATUS      RESTARTS      AGE
kube-system     coredns-5dd5756b68-fq2vj                           1/1     Running     0             27h
kube-system     etcd-minikube                                      1/1     Running     0             27h
kube-system     kube-apiserver-minikube                            1/1     Running     0             27h
kube-system     kube-controller-manager-minikube                   1/1     Running     0             27h
kube-system     kube-proxy-ccc5w                                   1/1     Running     0             27h
kube-system     kube-scheduler-minikube                            1/1     Running     0             27h
kube-system     storage-provisioner                                1/1     Running     1 (27h ago)   27h

4.4.1 部署ingress nginx

在minikube集群启动后,启动部署前面用国内阿里源替换后的yaml配置单即可:

shell 复制代码
kubectl apply -f ingress-nginx-aliyun.yml

等待部署结束后即可观察到有ingress-nginx-xxx命名的相关pod完成创建:

shell 复制代码
foo@awx01:~$ kubectl get pods -A
NAMESPACE       NAME                                               READY   STATUS      RESTARTS      AGE
ingress-nginx   ingress-nginx-admission-create-7wlxn               0/1     Completed   0             27h
ingress-nginx   ingress-nginx-admission-patch-x8bzm                0/1     Completed   0             27h
ingress-nginx   ingress-nginx-controller-f96f88fd5-zzzfc           1/1     Running     0             27h
kube-system     coredns-5dd5756b68-fq2vj                           1/1     Running     0             27h
kube-system     etcd-minikube                                      1/1     Running     0             27h
kube-system     kube-apiserver-minikube                            1/1     Running     0             27h
kube-system     kube-controller-manager-minikube                   1/1     Running     0             27h
kube-system     kube-proxy-ccc5w                                   1/1     Running     0             27h
kube-system     kube-scheduler-minikube                            1/1     Running     0             27h
kube-system     storage-provisioner                                1/1     Running     1 (27h ago)   27h

4.4.2 部署awx operator镜像pod

官方提供了一份kustomization.yaml配置文件示例:

ansible.readthedocs.io/projects/aw...

按照教程将<tag>字段替换为本次待部署的awx版本号2.8.0,如下,注意这里将namespace设定为awx

yaml 复制代码
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  # Find the latest tag here: https://github.com/ansible/awx-operator/releases
  - github.com/ansible/awx-operator/config/default?ref=2.8.0

# Set the image tags to match the git version from above
images:
  - name: quay.io/ansible/awx-operator
    newTag: 2.8.0

# Specify a custom namespace in which to install AWX
namespace: awx

由于本次awx搭建需要将服务暴露到ubuntu虚机所在网段中供其他应用基于ubuntu虚机地址与端口发起调用测试,这里再配置nodeport方式进行service接入。

4.4.3 部署nodeport接入awx

编辑yaml配置清单,name字段可自定义,后续service相关命名都会以此为前缀,主体内容如下,将文件命名为awx-demo.yaml

yaml 复制代码
---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
  name: awx-demo
spec:
  service_type: nodeport

实测直接配置nodeport接入会触发类似unable to recognize "ansible-awx.yml": no matches for kind "AWX" in version "awx.ansible.com/v1beta1的报错,提示不识别yaml配置单中自定义kind: AWX信息,此时可执行如下命令先导入crd描述:

shell 复制代码
kubectl get crd awxs.awx.ansible.com

相关处理方法可参考github issue讨论:

github.com/kubernetes/...

awx-demo.yaml配置单与上面awx operator配置单kustomization.yaml放置服务器同一路径下,并在kustomization.yaml中增加对awx-demo.yaml的资源引用:

yaml 复制代码
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  # Find the latest tag here: https://github.com/ansible/awx-operator/releases
  - github.com/ansible/awx-operator/config/default?ref=2.8.0
  - awx-demo.yaml

# Set the image tags to match the git version from above
images:
  - name: quay.io/ansible/awx-operator
    newTag: 2.8.0

# Specify a custom namespace in which to install AWX
namespace: awx

此时进入kustomization.yaml配置单所在路径,启动资源部署:

shell 复制代码
kubectl apply -k .

完成后可观察到如下service信息:

shell 复制代码
foo@awx01:~$ kubectl get svc -n awx
NAME                                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
awx-demo-postgres-13                              ClusterIP   None            <none>        5432/TCP       26h
awx-demo-service                                  NodePort    10.110.79.238   <none>        80:30967/TCP   26h
awx-operator-controller-manager-metrics-service   ClusterIP   10.103.240.26   <none>        8443/TCP       26h

可检查service在minikube上对其宿主系统暴露的地址与端口如下,示例中为http://192.168.49.2:30967

shell 复制代码
foo@awx01:~$ minikube service list -n awx
|-----------|-------------------------------------------------|--------------|---------------------------|
| NAMESPACE |                      NAME                       | TARGET PORT  |            URL            |
|-----------|-------------------------------------------------|--------------|---------------------------|
| awx       | awx-demo-postgres-13                            | No node port |                           |
| awx       | awx-demo-service                                | http/80      | http://192.168.49.2:30967 |
| awx       | awx-operator-controller-manager-metrics-service | No node port |                           |
|-----------|-------------------------------------------------|--------------|---------------------------|

在ubuntu中对service URL执行curl测试可以观察到有响应,说明服务对宿主系统暴露生效:

shell 复制代码
foo@awx01:~$ curl http://192.168.49.2:30967
<!doctype html><html lang="en"><head><script nonce="vP3O7dvhN1XXP9b8UIPlDAvXGMJuJuinQP561fbeU9Q=" type="text/javascript">window.NONCE_ID="vP3O7dvhN1XXP9b8UIPlDAvXGMJuJuinQP561fbeU9Q="</script><meta http-equiv="Content-Security-Policy" content="default-src 'self'; connect-src 'self' ws: wss:; style-src 'self' 'unsafe-inline'; script-src 'self' 'nonce-vP3O7dvhN1XXP9b8UIPlDAvXGMJuJuinQP561fbeU9Q=' *.pendo.io; img-src 'self' *.pendo.io data:; worker-src 'self' blob: ;"/><link rel="shortcut icon" href="/static/media/favicon.ico"/><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="AWX"/><script defer="defer" src="./static/js/main.fcec0bf3.js"></script><link href="./static/css/main.bcaaa591.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><style nonce="vP3O7dvhN1XXP9b8UIPlDAvXGMJuJuinQP561fbeU9Q=">.app{height:100%}</style><div id="app" class="app"></div></body></html>

4.4.4 获取初始admin账号密码

在部署awx相关service启动运行后,执行命令如下会在终端输出admin管理员账号密码明文:

shell 复制代码
kubectl get secret awx-demo-admin-password -o jsonpath="{.data.password}" -n awx | base64 --decode ; echo
a0FiIJ.......P1jR

4.5 配置ssh端口转发暴露服务

可以看到awx对应service中并未绑定external ip将服务暴露到ubuntu系统所在业务网段,参考minikube文档对nodeport访问的说明,基于docker容器引擎运行的minikube不会创建隧道,使用minikube service <service-name> --url命令选项暴露service只对minikube宿主系统上的进程可访问:

minikube.sigs.k8s.io/docs/handbo...

Running minikube on Linux with the Docker driver will result in no tunnel being created...

minikube service hello-minikube1 --url runs as a process, creating a tunnel to the cluster. The command exposes the service directly to any program running on the host operating system.

由于awx-demo-service已经暴露了对ubuntu系统可访问的内部IP与端口192.168.49.2:30967,那么此时在ubuntu系统上使用ssh做一次端口转发即可将内部IP与端口映射到ubuntu系统业务IP与端口上,命令格式如下,如果需要端口转发后台一直有效还可加上命令选项-f

shell 复制代码
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i <ssh_private_key_file_path> -g -N  -L <ubuntu_sys_custom_port>:192.168.49.2:30967 foo@<ubuntu_sys_ip> 

以实验环境为例,执行命令如下,将service内部端口映射到192.168.20.184:9000

shell 复制代码
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i /home/foo/.ssh/id_rsa -g -Nf  -L 9000:192.168.49.2:30967 foo@192.168.20.184 

此时用ubuntu虚机实例同网段其他系统或者其宿主机系统浏览器打开ubuntu虚机地址与自定义映射端口即可看到部署的awx平台web界面:

http://192.168.20.184:9000

输入前面admin账号密码即可看到页面后台初始状态:

相关推荐
学习使我快乐013 小时前
JS进阶 3——深入面向对象、原型
开发语言·前端·javascript
bobostudio19953 小时前
TypeScript 设计模式之【策略模式】
前端·javascript·设计模式·typescript·策略模式
黄尚圈圈4 小时前
Vue 中引入 ECharts 的详细步骤与示例
前端·vue.js·echarts
浮华似水5 小时前
简洁之道 - React Hook Form
前端
正小安7 小时前
如何在微信小程序中实现分包加载和预下载
前端·微信小程序·小程序
_.Switch9 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
一路向前的月光9 小时前
Vue2中的监听和计算属性的区别
前端·javascript·vue.js
长路 ㅤ   9 小时前
vite学习教程06、vite.config.js配置
前端·vite配置·端口设置·本地开发
长路 ㅤ   9 小时前
vue-live2d看板娘集成方案设计使用教程
前端·javascript·vue.js·live2d