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账号密码即可看到页面后台初始状态:

相关推荐
im_AMBER17 分钟前
Web 开发 27
前端·javascript·笔记·后端·学习·web
蓝胖子的多啦A梦43 分钟前
低版本Chrome导致弹框无法滚动的解决方案
前端·css·html·chrome浏览器·版本不同造成问题·弹框页面无法滚动
玩代码44 分钟前
vue项目安装chromedriver超时解决办法
前端·javascript·vue.js
訾博ZiBo1 小时前
React 状态管理中的循环更新陷阱与解决方案
前端
StarPrayers.1 小时前
旅行商问题(TSP)(2)(heuristics.py)(TSP 的两种贪心启发式算法实现)
前端·人工智能·python·算法·pycharm·启发式算法
一壶浊酒..2 小时前
ajax局部更新
前端·ajax·okhttp
DoraBigHead2 小时前
React 架构重生记:从递归地狱到时间切片
前端·javascript·react.js
彩旗工作室3 小时前
WordPress 本地开发环境完全指南:从零开始理解 Local by Flywhee
前端·wordpress·网站
iuuia3 小时前
02--CSS基础
前端·css
kyle~3 小时前
Qt---setAttribute设置控件或窗口的内部属性
服务器·前端·c++·qt