一、任务背景
在项目开发时为了快速测试应用代码与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
整体搭建过程可参考如下教程,但需注意国内网络环境很多资源通过在线下载获取会失败,本文在此基础上增补相关绕行办法:
三、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:
创建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>
改为实际所需的版本,在浏览器中访问后会显示配置单内容(此网站访问也需要搭梯子辅助):
下载配置单到本地,个人将其命名为ingress-nginx-aliyun.yml
。离线编辑其中image字段,将image: registry.k8s.io/ingress-nginx...
字段指向的地址全部修改为国内源地址,这里以阿里镜像源为例,并且镜像命名也有所变化:
- 原始地址:registry.k8s.io/ingress-nginx/controller:v1.9.3@sha256:8fd21d59428507671ce0fb47f818b1d859c92d2ad07bb7c947268d433030ba98
- 更换为国内阿里地址:registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.9.3
- (注意,这里镜像文件命名从原始
controller:v1.9.3
改为nginx-ingress-controller:v1.9.3
)
- 原始地址:registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231011-8b53cabe0@sha256:a7943503b45d552785aa3b5e457f169a5661fb94d82b8a3373bcd9ebaf9aac80
保存修改后的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
配置文件示例:
按照教程将<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讨论:
将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 [email protected]
此时用ubuntu虚机实例同网段其他系统或者其宿主机系统浏览器打开ubuntu虚机地址与自定义映射端口即可看到部署的awx平台web界面:
输入前面admin账号密码即可看到页面后台初始状态: