feat: add role dependency in builtin playbook (#2653)

Signed-off-by: joyceliu <joyceliu@yunify.com>
This commit is contained in:
liujian 2025-07-09 16:10:18 +08:00 committed by GitHub
parent e5077f51e9
commit b68c73de2d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
100 changed files with 557 additions and 526 deletions

View File

@ -1,25 +0,0 @@
.PHONY: create-role
create-role: ## create a role necessary file in roles
@echo "Creating role $(role) in ${base} ..."
@mkdir -p ${base}/roles/$(role)/tasks
@echo "---" > ${base}/roles/$(role)/tasks/main.yaml
@mkdir -p ${base}/roles/$(role)/defaults
@echo "" > ${base}/roles/$(role)/defaults/main.yaml
ifeq ($(VARIABLE_NAME),"full")
@mkdir -p ${base}/roles/$(role)/handlers
@mkdir -p ${base}/roles/$(role)/templates
@mkdir -p ${base}/roles/$(role)/files
@mkdir -p ${base}/roles/$(role)/vars
@mkdir -p ${base}/roles/$(role)/meta
@echo "---" > ${base}/roles/$(role)/handlers/main.yaml
@echo "---" > ${base}/roles/$(role)/templates/main.yaml
@echo "---" > ${base}/roles/$(role)/files/main.yaml
@echo "---" > ${base}/roles/$(role)/vars/main.yaml
@echo "---" > ${base}/roles/$(role)/defaults/main.yaml
@echo "---" > ${base}/roles/$(role)/meta/main.yaml
endif
@echo "Role $(role) created successfully"
.PHONY: help
help: ## Display this help.
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n\nTargets:\n"} /^[0-9A-Za-z_-]+:.*?##/ { printf " \033[36m%-45s\033[0m %s\n", $$1, $$2 } /^\$$\([0-9A-Za-z_-]+\):.*?##/ { gsub("_","-", $$1); printf " \033[36m%-45s\033[0m %s\n", tolower(substr($$1, 3, length($$1)-7)), $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)

View File

@ -20,9 +20,9 @@ spec:
# harbor_version: v2.6.3
# docker-compose binary
# dockercompose_version: v2.12.2
# ========== image registry: registry ==========
# registry image tag
# registry_version: 2.8.3
# ========== image registry: docker-registry ==========
# docker-registry image tag
# docker_registry_version: 2.8.3
# ========== cri ==========
# crictl binary
crictl_version: v1.23.0

View File

@ -20,9 +20,9 @@ spec:
# harbor_version: v2.7.1
# docker-compose binary
# dockercompose_version: v2.14.0
# ========== image registry: registry ==========
# registry image tag
# registry_version: 2.8.3
# ========== image registry: docker-registry ==========
# docker-registry image tag
# docker_registry_version: 2.8.3
# ========== cri ==========
# crictl binary
crictl_version: v1.24.0

View File

@ -20,9 +20,9 @@ spec:
# harbor_version: v2.8.1
# docker-compose binary
# dockercompose_version: v2.15.1
# ========== image registry: registry ==========
# registry image tag
# registry_version: 2.8.3
# ========== image registry: docker-registry ==========
# docker-registry image tag
# docker_registry_version: 2.8.3
# ========== cri ==========
# crictl binary
crictl_version: v1.25.0

View File

@ -20,9 +20,9 @@ spec:
# harbor_version: v2.9.1
# docker-compose binary
# dockercompose_version: v2.16.0
# ========== image registry: registry ==========
# registry image tag
# registry_version: 2.8.3
# ========== image registry: docker-registry ==========
# docker-registry image tag
# docker_registry_version: 2.8.3
# ========== cri ==========
# crictl binary
crictl_version: v1.26.0

View File

@ -20,9 +20,9 @@ spec:
# harbor_version: v2.10.1
# docker-compose binary
# dockercompose_version: v2.20.3
# ========== image registry: registry ==========
# registry image tag
# registry_version: 2.8.3
# ========== image registry: docker-registry ==========
# docker-registry image tag
# docker_registry_version: 2.8.3
# ========== cri ==========
# crictl binary
crictl_version: v1.27.0

View File

@ -20,9 +20,9 @@ spec:
# harbor_version: v2.10.1
# docker-compose binary
# dockercompose_version: v2.20.3
# ========== image registry: registry ==========
# registry image tag
# registry_version: 2.8.3
# ========== image registry: docker-registry ==========
# docker-registry image tag
# docker_registry_version: 2.8.3
# ========== cri ==========
# crictl binary
crictl_version: v1.28.0

View File

@ -20,9 +20,9 @@ spec:
# harbor_version: v2.10.1
# docker-compose binary
# dockercompose_version: v2.20.3
# ========== image registry: registry ==========
# registry image tag
# registry_version: 2.8.3
# ========== image registry: docker-registry ==========
# docker-registry image tag
# docker_registry_version: 2.8.3
# ========== cri ==========
# crictl binary
crictl_version: v1.29.0

View File

@ -20,9 +20,9 @@ spec:
# harbor_version: v2.10.1
# docker-compose binary
# dockercompose_version: v2.20.3
# ========== image registry: registry ==========
# registry image tag
# registry_version: 2.8.3
# ========== image registry: docker-registry ==========
# docker-registry image tag
# docker_registry_version: 2.8.3
# ========== cri ==========
# crictl binary
crictl_version: v1.30.0

View File

@ -20,9 +20,9 @@ spec:
# harbor_version: v2.10.1
# docker-compose binary
# dockercompose_version: v2.20.3
# ========== image registry: registry ==========
# registry image tag
# registry_version: 2.8.3
# ========== image registry: docker-registry ==========
# docker-registry image tag
# docker_registry_version: 2.8.3
# ========== cri ==========
# crictl binary
crictl_version: v1.31.0

View File

@ -20,9 +20,9 @@ spec:
# harbor_version: v2.10.1
# docker-compose binary
# dockercompose_version: v2.20.3
# ========== image registry: registry ==========
# registry image tag
# registry_version: 2.8.3
# ========== image registry: docker-registry ==========
# docker-registry image tag
# docker_registry_version: 2.8.3
# ========== cri ==========
# crictl binary
crictl_version: v1.32.0

View File

@ -20,9 +20,9 @@ spec:
# harbor_version: v2.10.1
# docker-compose binary
# dockercompose_version: v2.20.3
# ========== image registry: registry ==========
# registry image tag
# registry_version: 2.8.3
# ========== image registry: docker-registry ==========
# docker-registry image tag
# docker_registry_version: 2.8.3
# ========== cri ==========
# crictl binary
crictl_version: v1.33.0

View File

@ -33,7 +33,7 @@
- hosts:
- image_registry
roles:
- role: uninstall/image_registry
- role: uninstall/image-registry
when:
- .deleteImageRegistry

View File

@ -79,7 +79,7 @@
- hosts:
- image_registry
roles:
- role: uninstall/image_registry
- role: uninstall/image-registry
when:
- .deleteImageRegistry
- .delete_nodes | default list | has .inventory_hostname

View File

@ -10,6 +10,6 @@
- hosts:
- image_registry
roles:
- role: uninstall/image_registry
- role: uninstall/image-registry
- import_playbook: hook/post_install.yaml

View File

@ -5,7 +5,7 @@
src: >-
{{ .binary_dir }}/pki/image_registry.crt
dest: >-
/opt/registry/{{ .registry_version }}/ssl/server.crt
/opt/docker-registry/{{ .docker_registry_version }}/ssl/server.crt
- name: Sync image registry key file to remote
tags: ["certs"]
@ -13,7 +13,7 @@
src: >-
{{ .binary_dir }}/pki/image_registry.key
dest: >-
/opt/registry/{{ .registry_version }}/ssl/server.key
/opt/docker-registry/{{ .docker_registry_version }}/ssl/server.key
- name: Restart registry service
tags: ["certs"]

View File

@ -162,18 +162,18 @@ artifact:
{{- else -}}
https://github.com/docker/compose/releases/download/{{ .dockercompose_version }}/docker-compose-linux-aarch64
{{- end -}}
# registry:
# docker_registry:
# amd64: >-
# {{- if .kkzone | eq "cn" -}}
# https://kubernetes-release.pek3b.qingstor.com/registry/{{ .registry_version }}/registry-{{ .registry_version }}-linux-amd64.tgz
# https://kubernetes-release.pek3b.qingstor.com/registry/{{ .docker_registry_version }}/docker-registry-{{ .docker_registry_version }}-linux-amd64.tgz
# {{- else -}}
# https://github.com/kubesphere/kubekey/releases/download/{{ .registry_version }}/registry-{{ .registry_version }}-linux-amd64.tgz
# https://github.com/kubesphere/kubekey/releases/download/{{ .docker_registry_version }}/docker-registry-{{ .docker_registry_version }}-linux-amd64.tgz
# {{- end -}}
# arm64: >-
# {{- if .kkzone | eq "cn" -}}
# https://kubernetes-release.pek3b.qingstor.com/registry/{{ .registry_version }}/registry-{{ .registry_version }}-linux-arm64.tgz
# https://kubernetes-release.pek3b.qingstor.com/registry/{{ .docker_registry_version }}/docker-registry-{{ .docker_registry_version }}-linux-arm64.tgz
# {{- else -}}
# https://github.com/kubesphere/kubekey/releases/download/{{ .registry_version }}/registry-{{ .registry_version }}-linux-arm64.tgz
# https://github.com/kubesphere/kubekey/releases/download/{{ .docker_registry_version }}/docker-registry-{{ .docker_registry_version }}-linux-arm64.tgz
# {{- end -}}
harbor:
amd64: >-

View File

@ -201,20 +201,20 @@
- name: Check binaries for registry
tags: ["registry"]
command: |
artifact_name={{ get .artifact.artifact_url.registry .item | splitList "/" | last }}
artifact_path={{ .binary_dir }}/image-registry/registry/{{ .registry_version }}/{{ .item }}
artifact_name={{ get .artifact.artifact_url.docker_registry .item | splitList "/" | last }}
artifact_path={{ .binary_dir }}/image-registry/docker-registry/{{ .docker_registry_version }}/{{ .item }}
if [ ! -f $artifact_path/$artifact_name ]; then
mkdir -p $artifact_path
# download online
http_code=$(curl -Lo /dev/null -s -w "%{http_code}" {{ get .artifact.artifact_url.registry .item }})
http_code=$(curl -Lo /dev/null -s -w "%{http_code}" {{ get .artifact.artifact_url.docker_registry .item }})
if [ $http_code != 200 ]; then
echo "http code is $http_code"
exit 1
fi
curl -L -o $artifact_path/$artifact_name {{ get .artifact.artifact_url.registry .item }}
curl -L -o $artifact_path/$artifact_name {{ get .artifact.artifact_url.docker_registry .item }}
fi
loop: "{{ .artifact.arch | toJson }}"
when: .registry_version | empty | not
when: .docker_registry_version | empty | not
- name: Check binaries for docker-compose
tags: ["docker-compose"]

View File

@ -0,0 +1,12 @@
cni:
calico:
values: |
# calico helm values
tigeraOperator:
registry: {{ .quayio_registry }}
calicoctl:
image: {{ .dockerio_registry }}/calico/ctl
installation:
registry: {{ .dockerio_registry }}
calicoNetwork:
bgp: Enabled

View File

@ -0,0 +1,70 @@
cni:
cilium:
values: |
# cilium helm values
image:
repository: {{ .quayio_registry }}/cilium/cilium-cli
certgen:
image:
repository: {{ .quayio_registry }}/cilium/certgen
hubble:
relay:
image:
repository: {{ .quayio_registry }}/cilium/hubble-relay-ci
ui:
backend:
image:
repository: {{ .quayio_registry }}/cilium/hubble-ui-backend
frontend:
image:
repository: {{ .quayio_registry }}/cilium/hubble-ui
envoy:
image:
repository: {{ .quayio_registry }}/cilium/cilium-envoy
operator:
replicas: 2
image:
repository: {{ .quayio_registry }}/cilium/operator
nodeinit:
image:
repository: {{ .quayio_registry }}/cilium/startup-script
preflight:
image:
repository: {{ .quayio_registry }}/cilium/cilium-ci
clustermesh:
apiserver:
image:
repository: {{ .quayio_registry }}/cilium/clustermesh-apiserver-ci
authentication:
mutual:
spire:
install:
initImage:
repository: {{ .dockerio_registry }}/library/busybox
agent:
image:
repository: {{ .ghcrio_registry }}/spiffe/spire-agent
server:
image:
repository: {{ .ghcrio_registry }}/spiffe/spire-server
ipv4:
enabled: {{ .cni.ipv4_support }}
ipv6:
enabled: {{ .cni.ipv6_support }}
ipam:
operator:
{{- if .cni.ipv4_support }}
clusterPoolIPv4PodCIDRList:
- {{ .cni.ipv4_pods_cidr }}
clusterPoolIPv4MaskSize: {{ .cni.ipv4_block_size }}
{{- end }}
{{- if .cni.ipv6_support }}
clusterPoolIPv6PodCIDRList:
- {{ .cni.ipv6_pods_cidr }}
clusterPoolIPv6MaskSize: {{ .cni.ipv6_block_size }}
{{- end }}
{{- if not (.kubernetes.kube_proxy.enabled | default true) }}
kubeProxyReplacement: "true"
k8sServiceHost: {{ .kubernetes.control_plane_endpoint.host }}
k8sServicePort: {{ .kubernetes.control_plane_endpoint.port }}
{{- end }}

View File

@ -36,134 +36,4 @@ cni:
{{ .kubernetes.networking.ipv4_mask_size | default 64 }}
kube_svc_cidr: >-
{{ .kubernetes.networking.service_cidr | default "10.233.0.0/18" }}
calico:
values: |
# calico helm values
tigeraOperator:
registry: {{ .quayio_registry }}
calicoctl:
image: {{ .dockerio_registry }}/calico/ctl
installation:
registry: {{ .dockerio_registry }}
calicoNetwork:
bgp: Enabled
cilium:
values: |
# cilium helm values
image:
repository: {{ .quayio_registry }}/cilium/cilium-cli
certgen:
image:
repository: {{ .quayio_registry }}/cilium/certgen
hubble:
relay:
image:
repository: {{ .quayio_registry }}/cilium/hubble-relay-ci
ui:
backend:
image:
repository: {{ .quayio_registry }}/cilium/hubble-ui-backend
frontend:
image:
repository: {{ .quayio_registry }}/cilium/hubble-ui
envoy:
image:
repository: {{ .quayio_registry }}/cilium/cilium-envoy
operator:
replicas: 2
image:
repository: {{ .quayio_registry }}/cilium/operator
nodeinit:
image:
repository: {{ .quayio_registry }}/cilium/startup-script
preflight:
image:
repository: {{ .quayio_registry }}/cilium/cilium-ci
clustermesh:
apiserver:
image:
repository: {{ .quayio_registry }}/cilium/clustermesh-apiserver-ci
authentication:
mutual:
spire:
install:
initImage:
repository: {{ .dockerio_registry }}/library/busybox
agent:
image:
repository: {{ .ghcrio_registry }}/spiffe/spire-agent
server:
image:
repository: {{ .ghcrio_registry }}/spiffe/spire-server
ipv4:
enabled: {{ .cni.ipv4_support }}
ipv6:
enabled: {{ .cni.ipv6_support }}
ipam:
operator:
{{- if .cni.ipv4_support }}
clusterPoolIPv4PodCIDRList:
- {{ .cni.ipv4_pods_cidr }}
clusterPoolIPv4MaskSize: {{ .cni.ipv4_block_size }}
{{- end }}
{{- if .cni.ipv6_support }}
clusterPoolIPv6PodCIDRList:
- {{ .cni.ipv6_pods_cidr }}
clusterPoolIPv6MaskSize: {{ .cni.ipv6_block_size }}
{{- end }}
{{- if not (.kubernetes.kube_proxy.enabled | default true) }}
kubeProxyReplacement: "true"
k8sServiceHost: {{ .kubernetes.control_plane_endpoint.host }}
k8sServicePort: {{ .kubernetes.control_plane_endpoint.port }}
{{- end }}
flannel:
# https://github.com/flannel-io/flannel/blob/master/Documentation/backends.md
values: |
# flannel helm values
podCidr: {{ .cni.ipv4_pod_cidr }}
podCidrv6: {{ .cni.ipv6_pod_cidr }}
flannel:
image:
repository: {{ .dockerio_registry }}/flannel/flannel
image_cni:
repository: {{ .dockerio_registry }}/flannel/flannel-cni-plugin
# support "vxlan" and "host-gw"
backend: vxlan
hybridnet:
values: |
# hybridnet helm values
images:
registryURL: {{ .dockerio_registry }}
kubeovn:
values: |
# kube-ovn helm values
global:
registry:
address: {{ .dockerio_registry }}/kubeovn
{{- $ips := list }}
{{- range .groups.kube_control_plane | default list }}
{{- $internalIPv4 := index $.hostvars . "internal_ipv4" | default "" }}
{{- $internalIPv6 := index $.hostvars . "internal_ipv6" | default "" }}
{{- if $internalIPv4| empty | not }}
{{- $ips = append $ips $internalIPv4 }}
{{- else if $internalIPv6 | empty | not }}
{{- $ips = append $ips $internalIPv6 }}
{{- end }}
{{- end }}
MASTER_NODES: {{ $ips | join "," }}
networking:
NET_STACK: {{ if and .cni.ipv4_support (not .cni.ipv6_support) }}ipv4{{ else if and .cni.ipv6_support (not .cni.ipv4_support) }}ipv6{{ else if and .cni.ipv4_support .cni.ipv6_support }}dual_stack{{ end }}
{{- if and .cni.ipv4_support (not .cni.ipv6_support) }}
ipv4:
POD_CIDR: {{ .cni.ipv4_pods_cidr }}
SVC_CIDR: {{ .cni.kube_svc_cidr }}
{{ else if and .cni.ipv6_support (not .cni.ipv4_support) }}
ipv6:
POD_CIDR: {{ .cni.ipv6_pods_cidr }}
SVC_CIDR: {{ .cni.kube_svc_cidr }}
{{ else if and .cni.ipv4_support .cni.ipv6_support }}
dual_stack:
POD_CIDR: {{ .cni.ipv4_pods_cidr }},{{ .cni.ipv6_pods_cidr }}
SVC_CIDR: {{ .cni.kube_svc_cidr }}
{{- end }}

View File

@ -0,0 +1,14 @@
cni:
flannel:
# https://github.com/flannel-io/flannel/blob/master/Documentation/backends.md
values: |
# flannel helm values
podCidr: {{ .cni.ipv4_pod_cidr }}
podCidrv6: {{ .cni.ipv6_pod_cidr }}
flannel:
image:
repository: {{ .dockerio_registry }}/flannel/flannel
image_cni:
repository: {{ .dockerio_registry }}/flannel/flannel-cni-plugin
# support "vxlan" and "host-gw"
backend: vxlan

View File

@ -0,0 +1,6 @@
cni:
hybridnet:
values: |
# hybridnet helm values
images:
registryURL: {{ .dockerio_registry }}

View File

@ -0,0 +1,33 @@
cni:
kubeovn:
values: |
# kube-ovn helm values
global:
registry:
address: {{ .dockerio_registry }}/kubeovn
{{- $ips := list }}
{{- range .groups.kube_control_plane | default list }}
{{- $internalIPv4 := index $.hostvars . "internal_ipv4" | default "" }}
{{- $internalIPv6 := index $.hostvars . "internal_ipv6" | default "" }}
{{- if $internalIPv4| empty | not }}
{{- $ips = append $ips $internalIPv4 }}
{{- else if $internalIPv6 | empty | not }}
{{- $ips = append $ips $internalIPv6 }}
{{- end }}
{{- end }}
MASTER_NODES: {{ $ips | join "," }}
networking:
NET_STACK: {{ if and .cni.ipv4_support (not .cni.ipv6_support) }}ipv4{{ else if and .cni.ipv6_support (not .cni.ipv4_support) }}ipv6{{ else if and .cni.ipv4_support .cni.ipv6_support }}dual_stack{{ end }}
{{- if and .cni.ipv4_support (not .cni.ipv6_support) }}
ipv4:
POD_CIDR: {{ .cni.ipv4_pods_cidr }}
SVC_CIDR: {{ .cni.kube_svc_cidr }}
{{ else if and .cni.ipv6_support (not .cni.ipv4_support) }}
ipv6:
POD_CIDR: {{ .cni.ipv6_pods_cidr }}
SVC_CIDR: {{ .cni.kube_svc_cidr }}
{{ else if and .cni.ipv4_support .cni.ipv6_support }}
dual_stack:
POD_CIDR: {{ .cni.ipv4_pods_cidr }},{{ .cni.ipv6_pods_cidr }}
SVC_CIDR: {{ .cni.kube_svc_cidr }}
{{- end }}

View File

@ -0,0 +1,19 @@
---
dependencies:
- role: install/cni/multus
when: .cni.multus.enabled
- role: install/cni/calico
when: .cni.type | eq "calico"
- role: install/cni/cilium
when: .cni.type | eq "cilium"
- role: install/cni/flannel
when: .cni.type | eq "flannel"
- role: install/cni/kubeovn
when: .cni.type | eq "kubeovn"
- role: install/cni/hybridnet
when: .cni.type | eq "hyvbridnet"

View File

@ -1,18 +0,0 @@
---
- include_tasks: calico.yaml
when: .cni.type | eq "calico"
- include_tasks: cilium.yaml
when: .cni.type | eq "cilium"
- include_tasks: flannel.yaml
when: .cni.type | eq "flannel"
- include_tasks: kubeovn.yaml
when: .cni.type | eq "kubeovn"
- include_tasks: hybridnet.yaml
when: .cni.type | eq "hyvbridnet"
- include_tasks: multus.yaml
when: .cni.multus.enabled

View File

@ -0,0 +1,3 @@
cri:
containerd:
data_root: /var/lib/containerd

View File

@ -29,7 +29,7 @@
tar -xvf {{ .tmp_dir }}/containerd-{{ .containerd_version | default "" | trimPrefix "v" }}-linux-{{ .binary_type }}.tar.gz --strip-components=1 -C /usr/local/bin/
- name: Generate containerd config file
template:
src: containerd.config
src: config.toml
dest: /etc/containerd/config.toml
- name: Generate containerd Service file
copy:

View File

@ -18,5 +18,5 @@
tar -xvf {{ .tmp_dir }}/crictl-{{ .crictl_version }}-linux-{{ .binary_type }}.tar.gz -C /usr/local/bin/
- name: Generate crictl config file
template:
src: crictl.config
src: crictl.yaml
dest: /etc/crictl.yaml

View File

@ -0,0 +1,3 @@
cri:
docker:
data_root: /var/lib/docker

View File

@ -1,4 +1,9 @@
---
# install cridockerd
- include_tasks: cridockerd.yaml
when:
- .kube_version | semverCompare ">=v1.24.0"
- name: Check if docker is installed
ignore_errors: true
command: docker --version
@ -18,7 +23,7 @@
tar -C /usr/local/bin/ --strip-components=1 -xvf {{ .tmp_dir }}/docker-{{ .docker_version }}.tgz --wildcards docker/*
- name: Generate docker config file
template:
src: docker.config
src: daemon.json
dest: /etc/docker/daemon.json
- name: Generate docker service file
copy:

View File

@ -0,0 +1,8 @@
dependencies:
- role: install/cri/crictl
- role: install/cri/docker
when: .cri.container_manager | eq "docker"
- role: install/cri/containerd
when: .cri.container_manager | eq "containerd"

View File

@ -1,17 +0,0 @@
---
# install crictl
- include_tasks: install_crictl.yaml
# install docker
- include_tasks: install_docker.yaml
when: .cri.container_manager | eq "docker"
# install containerd
- include_tasks: install_containerd.yaml
when: .cri.container_manager | eq "containerd"
# install cridockerd
- include_tasks: install_cridockerd.yaml
when:
- .cri.container_manager | eq "docker"
- .kube_version | semverCompare ">=v1.24.0"

View File

@ -1,4 +1,6 @@
image_registry:
# registry type. support: harbor, docker-registry
type: harbor
# ha_vip: 192.168.122.59
# which store images data which will push to registry.
images_dir: >-
@ -18,44 +20,3 @@ image_registry:
{{- end -}}
username: admin
password: Harbor12345
# registry type. support: harbor, registry
type: harbor
# Virtual IP address for repository High Availability. the Virtual IP address should be available.
harbor:
data_dir: /opt/harbor/data
registry:
version: 2
config:
storage: nfs
nfs_dir: /share/registry
storage:
filesystem:
rootdir: /opt/registry/data
# nfs_mount: /repository/registry # if set. will mount rootdirectory to nfs server in nfs_mount.
# azure:
# accountname: accountname
# accountkey: base64encodedaccountkey
# container: containername
# gcs:
# bucket: bucketname
# keyfile: /path/to/keyfile
# credentials:
# type: service_account
# project_id: project_id_string
# private_key_id: private_key_id_string
# private_key: private_key_string
# client_email: client@example.com
# client_id: client_id_string
# auth_uri: http://example.com/auth_uri
# token_uri: http://example.com/token_uri
# auth_provider_x509_cert_url: http://example.com/provider_cert_url
# client_x509_cert_url: http://example.com/client_cert_url
# rootdirectory: /gcs/object/name/prefix
# s3:
# accesskey: awsaccesskey
# secretkey: awssecretkey
# region: us-west-1
# regionendpoint: http://myobjects.local
# bucket: bucketname
# keyid: mykeyid
# rootdirectory: /s3/object/name/prefix

View File

@ -0,0 +1,5 @@
cri:
docker:
data_root: /var/lib/docker
containerd:
data_root: /var/lib/containerd

View File

@ -0,0 +1,26 @@
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=1048576
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target

View File

@ -15,7 +15,7 @@
{{ .tmp_dir }}/docker-{{ .docker_version }}.tgz
- name: Generate docker config file
template:
src: docker.config
src: daemon.json
dest: /etc/docker/daemon.json
- name: Unpackage docker binary
command: |

View File

@ -0,0 +1,4 @@
---
- include_tasks: docker.yaml
- include_tasks: docker_compose.yaml

View File

@ -0,0 +1,37 @@
image_registry:
docker_registry:
version: 2
config:
storage: nfs
nfs_dir: /share/registry
storage:
filesystem:
rootdir: /opt/docker-registry/data
# nfs_mount: /repository/registry # if set. will mount rootdirectory to nfs server in nfs_mount.
# azure:
# accountname: accountname
# accountkey: base64encodedaccountkey
# container: containername
# gcs:
# bucket: bucketname
# keyfile: /path/to/keyfile
# credentials:
# type: service_account
# project_id: project_id_string
# private_key_id: private_key_id_string
# private_key: private_key_string
# client_email: client@example.com
# client_id: client_id_string
# auth_uri: http://example.com/auth_uri
# token_uri: http://example.com/token_uri
# auth_provider_x509_cert_url: http://example.com/provider_cert_url
# client_x509_cert_url: http://example.com/client_cert_url
# rootdirectory: /gcs/object/name/prefix
# s3:
# accesskey: awsaccesskey
# secretkey: awssecretkey
# region: us-west-1
# regionendpoint: http://myobjects.local
# bucket: bucketname
# keyid: mykeyid
# rootdirectory: /s3/object/name/prefix

View File

@ -2,9 +2,9 @@
- name: Sync registry image to remote
copy:
src: >-
{{ .binary_dir }}/image-registry/registry/{{ .registry_version }}/{{ .binary_type }}/registry-{{ .registry_version }}-linux-{{ .binary_type }}.tgz
{{ .binary_dir }}/image-registry/docker-registry/{{ .docker_registry_version }}/{{ .binary_type }}/docker-registry-{{ .docker_registry_version }}-linux-{{ .binary_type }}.tgz
dest: >-
/opt/registry/{{ .registry_version }}/registry-{{ .registry_version }}-linux-{{ .binary_type }}.tgz
/opt/docker-registry/{{ .docker_registry_version }}/docker-registry-{{ .docker_registry_version }}-linux-{{ .binary_type }}.tgz
- name: Mount NFS dir
command: |
@ -17,52 +17,52 @@
{{- $internalIPv4 := index .hostvars (.groups.nfs | default list | first) "internal_ipv4" | default "" }}
{{- $internalIPv6 := index .hostvars (.groups.nfs | default list | first) "internal_ipv6" | default "" }}
{{- if $internalIPv4 | empty | not }}
mount -t nfs {{ $internalIPv4 }}:{{ .image_registry.registry.storage.filesystem.nfs_mount }} {{ .image_registry.registry.storage.filesystem.rootdir }}
mount -t nfs {{ $internalIPv4 }}:{{ .image_registry.docker_registry.storage.filesystem.nfs_mount }} {{ .image_registry.docker_registry.storage.filesystem.rootdir }}
{{- else if ne $internalIPv6 "" }}
{{ $internalIPv6 | empty | not }}
mount -t nfs {{ $internalIPv6 }}:{{ .image_registry.registry.storage.filesystem.nfs_mount }} {{ .image_registry.registry.storage.filesystem.rootdir }}
mount -t nfs {{ $internalIPv6 }}:{{ .image_registry.docker_registry.storage.filesystem.nfs_mount }} {{ .image_registry.docker_registry.storage.filesystem.rootdir }}
{{- end }}
when:
- .image_registry.registry.storage.filesystem.nfs_mount | empty | not
- .image_registry.docker_registry.storage.filesystem.nfs_mount | empty | not
- .groups.nfs | default list | len | eq 1
- name: Load registry image
command: |
docker load -i /opt/registry/{{ .registry_version }}/registry-{{ .registry_version }}-linux-{{ .binary_type }}.tgz
docker load -i /opt/docker-registry/{{ .docker_registry_version }}/docker-registry-{{ .docker_registry_version }}-linux-{{ .binary_type }}.tgz
- name: Sync image registry cert file to remote
copy:
src: >-
{{ .binary_dir }}/pki/image_registry.crt
dest: >-
/opt/registry/{{ .registry_version }}/ssl/server.crt
/opt/docker-registry/{{ .docker_registry_version }}/ssl/server.crt
- name: Sync image registry key file to remote
copy:
src: >-
{{ .binary_dir }}/pki/image_registry.key
dest: >-
/opt/registry/{{ .registry_version }}/ssl/server.key
/opt/docker-registry/{{ .docker_registry_version }}/ssl/server.key
- name: Generate registry docker compose
template:
src: registry.docker-compose
src: docker-compose.yaml
dest: >-
/opt/registry/{{ .registry_version }}/docker-compose.yml
/opt/docker-registry/{{ .docker_registry_version }}/docker-compose.yml
- name: Generate registry config
template:
src: registry.config
src: config.yaml
dest: >-
/opt/registry/{{ .registry_version }}/config.yml
/opt/docker-registry/{{ .docker_registry_version }}/config.yml
- name: Register registry service
template:
src: registry.service
dest: /etc/systemd/system/registry.service
src: docker-registry.service
dest: /etc/systemd/system/docker-registry.service
- name: Start registry service
command: systemctl daemon-reload && systemctl start registry.service && systemctl enable registry.service
command: systemctl daemon-reload && systemctl start docker-registry.service && systemctl enable docker-registry.service
- name: wait registry service ready
command: |

View File

@ -22,52 +22,52 @@ log:
# to:
# - errors@example.com
storage:
{{- if .image_registry.registry.storage.filesystem.rootdir | empty | not }}
{{- if .image_registry.docker_registry.storage.filesystem.rootdir | empty | not }}
filesystem:
rootdirectory: {{ .image_registry.registry.storage.filesystem.rootdir }}
rootdirectory: {{ .image_registry.docker_registry.storage.filesystem.rootdir }}
maxthreads: 100
{{- end }}
{{- if .image_registry.registry.storage.azure }}
{{- if .image_registry.docker_registry.storage.azure }}
azure:
accountname: {{ .image_registry.registry.storage.azure.accountname }}
accountkey: {{ .image_registry.registry.storage.azure.accountkey }}
container: {{ .image_registry.registry.storage.azure.container }}
accountname: {{ .image_registry.docker_registry.storage.azure.accountname }}
accountkey: {{ .image_registry.docker_registry.storage.azure.accountkey }}
container: {{ .image_registry.docker_registry.storage.azure.container }}
{{- end }}
{{- if .image_registry.registry.storage.gcs | empty | not }}
{{- if .image_registry.docker_registry.storage.gcs | empty | not }}
gcs:
bucket: {{ .image_registry.registry.storage.gcs.bucket }}
keyfile: {{ .image_registry.registry.storage.gcs.keyfile }}
bucket: {{ .image_registry.docker_registry.storage.gcs.bucket }}
keyfile: {{ .image_registry.docker_registry.storage.gcs.keyfile }}
credentials:
type: service_account
project_id: {{ .image_registry.registry.storage.gcs.credentials.project_id }}
private_key_id: {{ .image_registry.registry.storage.gcs.credentials.private_key_id }}
private_key: {{ .image_registry.registry.storage.gcs.credentials.private_key }}
client_email: {{ .image_registry.registry.storage.gcs.credentials.client_email }}
client_id: {{ .image_registry.registry.storage.gcs.credentials.client_id }}
auth_uri: {{ .image_registry.registry.storage.gcs.credentials.auth_uri }}
token_uri: {{ .image_registry.registry.storage.gcs.credentials.token_uri }}
auth_provider_x509_cert_url: {{ .image_registry.registry.storage.gcs.credentials.auth_provider_x509_cert_url }}
client_x509_cert_url: {{ .image_registry.registry.storage.gcs.credentials.client_x509_cert_url }}
rootdirectory: {{ .image_registry.registry.storage.gcs.rootdirectory }}
project_id: {{ .image_registry.docker_registry.storage.gcs.credentials.project_id }}
private_key_id: {{ .image_registry.docker_registry.storage.gcs.credentials.private_key_id }}
private_key: {{ .image_registry.docker_registry.storage.gcs.credentials.private_key }}
client_email: {{ .image_registry.docker_registry.storage.gcs.credentials.client_email }}
client_id: {{ .image_registry.docker_registry.storage.gcs.credentials.client_id }}
auth_uri: {{ .image_registry.docker_registry.storage.gcs.credentials.auth_uri }}
token_uri: {{ .image_registry.docker_registry.storage.gcs.credentials.token_uri }}
auth_provider_x509_cert_url: {{ .image_registry.docker_registry.storage.gcs.credentials.auth_provider_x509_cert_url }}
client_x509_cert_url: {{ .image_registry.docker_registry.storage.gcs.credentials.client_x509_cert_url }}
rootdirectory: {{ .image_registry.docker_registry.storage.gcs.rootdirectory }}
{{- end }}
{{- if .image_registry.registry.storage.s3 | empty | not }}
{{- if .image_registry.docker_registry.storage.s3 | empty | not }}
s3:
accesskey: {{ .image_registry.registry.storage.s3.accesskey }}
secretkey: {{ .image_registry.registry.storage.s3.secretkey }}
region: {{ .image_registry.registry.storage.s3.region }}
regionendpoint: {{ .image_registry.registry.storage.s3.regionendpoint }}
accesskey: {{ .image_registry.docker_registry.storage.s3.accesskey }}
secretkey: {{ .image_registry.docker_registry.storage.s3.secretkey }}
region: {{ .image_registry.docker_registry.storage.s3.region }}
regionendpoint: {{ .image_registry.docker_registry.storage.s3.regionendpoint }}
forcepathstyle: true
accelerate: false
bucket: {{ .image_registry.registry.storage.s3.bucket }}
bucket: {{ .image_registry.docker_registry.storage.s3.bucket }}
encrypt: true
keyid: {{ .image_registry.registry.storage.s3.keyid }}
keyid: {{ .image_registry.docker_registry.storage.s3.keyid }}
secure: true
v4auth: true
chunksize: 5242880
multipartcopychunksize: 33554432
multipartcopymaxconcurrency: 100
multipartcopythresholdsize: 33554432
rootdirectory: {{ .image_registry.registry.storage.s3.rootdirectory }}
rootdirectory: {{ .image_registry.docker_registry.storage.s3.rootdirectory }}
usedualstack: false
loglevel: debug
{{- end }}

View File

@ -2,7 +2,7 @@
version: '2.3'
services:
registry:
image: registry:{{ .registry_version }}
image: registry:{{ .docker_registry_version }}
container_name: registry
restart: always
dns_search: .
@ -15,10 +15,10 @@ services:
- SETUID
volumes:
- type: bind
source: /opt/registry/{{ .registry_version }}/ssl/
source: /opt/docker-registry/{{ .docker_registry_version }}/ssl/
target: /etc/registry/ssl/
- type: bind
source: /opt/registry/{{ .registry_version }}/config.yml
source: /opt/docker-registry/{{ .docker_registry_version }}/config.yml
target: /etc/docker/registry/config.yml
ports:
- 443:5000

View File

@ -1,11 +1,11 @@
[Unit]
Description=registry
Description=docker-registry
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
[Service]
Type=simple
ExecStart=/usr/local/bin/docker-compose -p registry -f /opt/registry/{{ .registry_version }}/docker-compose.yml up
ExecStart=/usr/local/bin/docker-compose -p registry -f /opt/docker-registry/{{ .docker_registry_version }}/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -p registry down
Restart=on-failure
[Install]

View File

@ -0,0 +1,4 @@
image_registry:
# Virtual IP address for repository High Availability. the Virtual IP address should be available.
harbor:
data_dir: /opt/harbor/data

View File

@ -26,7 +26,7 @@
- name: Generate harbor config
template:
src: harbor.config
src: harbor.yml
dest: >-
/opt/harbor/{{ .harbor_version }}/harbor/harbor.yml

View File

@ -59,7 +59,7 @@
- name: Sync healthcheck shell to remote
copy:
src: keepalived/healthcheck.sh
src: healthcheck.sh
dest: >-
/opt/keepalived/{{ .keepalived_version }}/healthcheck.sh
mode: 0755

View File

@ -0,0 +1,15 @@
---
dependencies:
- role: install/image-registry/docker-compose
- role: install/image-registry/keepalived
when:
- .image_registry.ha_vip | empty | not
- .groups.image_registry | len | lt 1
- role: install/image-registry/harbor
when: .image_registry.type | eq "harbor"
- role: install/image-registry/docker-registry
when: .image_registry.type | eq "docker-registry"

View File

@ -1,51 +0,0 @@
---
- name: Sync images to remote
tags: ["only_image"]
copy:
src: >-
{{ .binary_dir }}/images/
dest: >-
{{ .image_registry.images_dir }}
- name: Create harbor project for each image
tags: ["only_image"]
command: |
# Iterate through first-level subdirectories in images_dir (skip blobs)
for registry_dir in {{ .image_registry.images_dir }}*; do
if [ ! -d "$registry_dir" ] || [ "$(basename "$registry_dir")" = "blobs" ]; then
continue
fi
# Iterate through second-level subdirectories in registry_dir
for project_dir in "$registry_dir"/*; do
if [ ! -d "$project_dir" ]; then
continue
fi
project=$(basename "$project_dir")
# Check if project exists, create if not
resp=$(curl -u "{{ .image_registry.auth.username }}:{{ .image_registry.auth.password }}" -k -X GET "https://{{ .image_registry.auth.registry }}/api/v2.0/projects/${project}")
if echo "$resp" | grep -q '"code":"NOT_FOUND"'; then
curl -u "{{ .image_registry.auth.username }}:{{ .image_registry.auth.password }}" -k -X POST \
-H "Content-Type: application/json" \
"https://{{ .image_registry.auth.registry }}/api/v2.0/projects" \
-d "{ \"project_name\": \"${project}\", \"public\": true}"
fi
done
done
when: .image_registry.type | eq "harbor"
- name: Sync images package to image_registry
tags: ["only_image"]
image:
push:
images_dir: >-
{{ .image_registry.images_dir }}
dest: >-
{{ .image_registry.auth.registry }}/{{ .module.image.src.reference.repository }}:{{ .module.image.src.reference.reference }}
username: >-
{{ .image_registry.auth.username }}
password: >-
{{ .image_registry.auth.password }}
skip_tls_verify: true

View File

@ -1,32 +1,51 @@
---
- include_tasks: install_docker.yaml
- include_tasks: install_docker_compose.yaml
- include_tasks: install_keepalived.yaml
when:
- .image_registry.ha_vip | empty | not
- .groups.image_registry | len | lt 1
- name: Install harbor
when: .image_registry.type | eq "harbor"
block:
- name: Check if harbor installed
ignore_errors: true
command: systemctl is-active harbor.service
register: harbor_install_service
- include_tasks: install_harbor.yaml
when: .harbor_install_service.stdout | eq "inactive"
- name: Install registry
when: .image_registry.type | eq "registry"
block:
- name: Check if registry installed
ignore_errors: true
command: systemctl is-active registry.service
register: registry_install_service
- include_tasks: install_registry.yaml
when: .registry_install_service.stdout | eq "inactive"
- include_tasks: load_images.yaml
- name: Sync images to remote
tags: ["only_image"]
copy:
src: >-
{{ .binary_dir }}/images/
dest: >-
{{ .image_registry.images_dir }}
- name: Create harbor project for each image
tags: ["only_image"]
command: |
# Iterate through first-level subdirectories in images_dir (skip blobs)
for registry_dir in {{ .image_registry.images_dir }}*; do
if [ ! -d "$registry_dir" ] || [ "$(basename "$registry_dir")" = "blobs" ]; then
continue
fi
# Iterate through second-level subdirectories in registry_dir
for project_dir in "$registry_dir"/*; do
if [ ! -d "$project_dir" ]; then
continue
fi
project=$(basename "$project_dir")
# Check if project exists, create if not
resp=$(curl -u "{{ .image_registry.auth.username }}:{{ .image_registry.auth.password }}" -k -X GET "https://{{ .image_registry.auth.registry }}/api/v2.0/projects/${project}")
if echo "$resp" | grep -q '"code":"NOT_FOUND"'; then
curl -u "{{ .image_registry.auth.username }}:{{ .image_registry.auth.password }}" -k -X POST \
-H "Content-Type: application/json" \
"https://{{ .image_registry.auth.registry }}/api/v2.0/projects" \
-d "{ \"project_name\": \"${project}\", \"public\": true}"
fi
done
done
when: .image_registry.type | eq "harbor"
- name: Sync images package to image_registry
tags: ["only_image"]
image:
push:
images_dir: >-
{{ .image_registry.images_dir }}
dest: >-
{{ .image_registry.auth.registry }}/{{ .module.image.src.reference.repository }}:{{ .module.image.src.reference.reference }}
username: >-
{{ .image_registry.auth.username }}
password: >-
{{ .image_registry.auth.password }}
skip_tls_verify: true

View File

@ -12,10 +12,4 @@ sc:
{{ .dockerio_registry }}
repository: openebs/linux-utils
tag: 3.3.0
path: /var/openebs/local
nfs: # each k8s_cluster node should install nfs-utils
enabled: false
default: false
server: >-
{{ .groups.nfs | default list | first }}
path: /share/kubernetes
path: /var/openebs/local

View File

@ -0,0 +1,7 @@
---
dependencies:
- role: install/storageclass/local
when: .sc.local.enabled
- role: install/storageclass/nfs
when: .sc.nfs.enabled

View File

@ -0,0 +1,7 @@
sc:
nfs: # each k8s_cluster node should install nfs-utils
enabled: false
default: false
server: >-
{{ .groups.nfs | default list | first }}
path: /share/kubernetes

View File

@ -1,6 +0,0 @@
---
- include_tasks: local.yaml
when: .sc.local.enabled
- include_tasks: nfs.yaml
when: .sc.nfs.enabled

View File

@ -0,0 +1,3 @@
- name: Delete cri residue files
command: |
rm -f /usr/local/bin/crictl

View File

@ -0,0 +1,38 @@
---
- name: Stop docker service
ignore_errors: true
command: |
systemctl stop docker.service
systemctl disable docker.service
rm -rf /etc/systemd/system/docker.service*
systemctl daemon-reload
systemctl reset-failed docker.service
- name: Uninstall containerd
block:
- name: Uninstall containerd service
ignore_errors: true
command: |
systemctl stop containerd.service
systemctl disable containerd.service
rm -rf /etc/systemd/system/containerd.service*
systemctl daemon-reload
systemctl reset-failed containerd.service
- name: Delete containerd residue files
command: |
rm -rf {{ .cri.containerd.data_root }}
rm -rf /etc/containerd
rm -rf /usr/local/bin/containerd*
rm -f /usr/local/bin/runc
rm -f /usr/local/bin/ctr
- name: Delete docker residue files
command: |
rm -rf {{ .cri.docker.data_root }}
rm -rf /etc/docker
rm -rf /usr/local/bin/docker*
- name: Uninstall docker interface
ignore_errors: true
command: ip link delete docker0

View File

@ -0,0 +1,7 @@
---
- include_tasks: docker.yaml
# uninstall cridockerd
- include_tasks: cridockerd.yaml
when:
- .cridockerd_version | empty | not

View File

@ -0,0 +1,10 @@
---
dependencies:
- role: uninstall/cri/containerd
when: .cri.container_manager | eq "containerd"
- role: uninstall/cri/docker
when: .cri.container_manager | eq "docker"
- role: uninstall/cri/crictl

View File

@ -1,18 +0,0 @@
---
- name: Stop containerd
include_tasks: uninstall_containerd.yaml
when: .cri.container_manager | eq "containerd"
- name: Stop docker
include_tasks: uninstall_docker.yaml
when: .cri.container_manager | eq "docker"
# uninstall cridockerd
- include_tasks: uninstall_cridockerd.yaml
when:
- .cri.container_manager | eq "docker"
- .cridockerd_version | empty | not
- name: Delete cri residue files
command: |
rm -f /usr/local/bin/crictl

View File

@ -1,22 +0,0 @@
---
- name: Stop docker service
ignore_errors: true
command: |
systemctl stop docker.service
systemctl disable docker.service
rm -rf /etc/systemd/system/docker.service*
systemctl daemon-reload
systemctl reset-failed docker.service
- name: Uninstall containerd
include_tasks: uninstall_containerd.yaml
- name: Delete docker residue files
command: |
rm -rf {{ .cri.docker.data_root }}
rm -rf /etc/docker
rm -rf /usr/local/bin/docker*
- name: Uninstall docker interface
ignore_errors: true
command: ip link delete docker0

View File

@ -0,0 +1,3 @@
image_registry:
type: harbor
# Virtual IP address for repository High Availability. the Virtual IP address should be available.

View File

@ -0,0 +1,5 @@
cri:
docker:
data_root: /var/lib/docker
containerd:
data_root: /var/lib/containerd

View File

@ -0,0 +1,6 @@
image_registry:
docker_registry:
storage:
filesystem:
rootdir: /opt/docker-registry/data
# nfs_mount: /repository/registry # if set. will mount rootdirectory to nfs server in nfs_mount.

View File

@ -0,0 +1,19 @@
- name: Stop registry service
ignore_errors: true
command: |
systemctl stop docker-registry.service
systemctl disable docker-registry.service
rm -rf /etc/systemd/system/docker-registry.service*
systemctl daemon-reload
systemctl reset-failed docker-registry.service
- name: unmount nfs
when:
- .image_registry.docker_registry.storage.filesystem.nfs_mount | empty | not
- .groups.nfs | default list | len | eq 1
command: |
unmount {{ .image_registry.docker_registry.storage.filesystem.rootdir }}
- name: Delete residue registry files
command: |
rm -rf /opt/docker-registry/

View File

@ -0,0 +1,3 @@
image_registry:
harbor:
data_dir: /opt/harbor/data

View File

@ -0,0 +1,14 @@
dependencies:
- role: uninstall/image-registry/harbor
when: .image_registry.type | eq "harbor"
- role: uninstall/image-registry/docker-registry
when: .image_registry.type | eq "docker-registry"
- role: uninstall/image-registry/keepalived
when:
- .image_registry.ha_vip | empty | not
- .groups.image_registry | len | lt 1
- role: uninstall/image-registry/docker-compose
when: .deleteCRI

View File

@ -1,10 +0,0 @@
image_registry:
type: harbor
# Virtual IP address for repository High Availability. the Virtual IP address should be available.
harbor:
data_dir: /opt/harbor/data
registry:
storage:
filesystem:
rootdir: /opt/registry
# nfs_mount: /repository/registry # if set. will mount rootdirectory to nfs server in nfs_mount.

View File

@ -1,13 +0,0 @@
- include_tasks: harbor.yaml
when: .image_registry.type | eq "harbor"
- include_tasks: registry.yaml
when: .image_registry.type | eq "registry"
- include_tasks: keepalived.yaml
when:
- .image_registry.ha_vip | empty | not
- .groups.image_registry | len | lt 1
- include_tasks: docker.yaml
when: .deleteCRI

View File

@ -1,19 +0,0 @@
- name: Stop registry service
ignore_errors: true
command: |
systemctl stop registry.service
systemctl disable registry.service
rm -rf /etc/systemd/system/registry.service*
systemctl daemon-reload
systemctl reset-failed registry.service
- name: unmount nfs
when:
- .image_registry.registry.storage.filesystem.nfs_mount | empty | not
- .groups.nfs | default list | len | eq 1
command: |
unmount {{ .image_registry.registry.storage.filesystem.rootdir }}
- name: Delete residue registry files
command: |
rm -rf /opt/registry/

View File

@ -1,6 +1,6 @@
# image_registry
image_registry允许用户安装镜像仓库。支持harbor和registry两种镜像仓库
image_registry允许用户安装镜像仓库。支持`harbor`和`docker-registry`两种类型
## requirement
@ -70,7 +70,7 @@ harbor是默认安装的镜像仓库
```
- 在创建集群时,自动安装
在创建集群时,会检测 `image_registry` 节点是否安装了harbor, 没有安装时会自动根据配置安装harbor。
在创建集群时,会检测 `image_registry` 节点是否安装了`harbor`, 没有安装时会自动根据配置安装`harbor`
```shell
kk create cluster -i inventory.yaml --set harbor_version=v2.10.1,docker_version=24.0.7, dockercompose_version=v2.20.3
```
@ -161,32 +161,32 @@ spec:
kubekey暂未提供registry的离线镜像包地址需通过手动打包的方式来实现。
```shell
# download registry images
docker pull registry:{{ .registry_version }}
docker pull registry:{{ .docker_registry_version }}
# package image
docker save -o registry-{{ .registry_version }}-linux-{{ .binary_type }}.tgz registry:{{ .registry_version }}
docker save -o docker-registry-{{ .docker_registry_version }}-linux-{{ .binary_type }}.tgz registry:{{ .docker_registry_version }}
# move image to workdir
mv registry-{{ .registry_version }}-linux-{{ .binary_type }}.tgz {{ .binary_dir }}/ image-registry/registry/{{ .registry_version }}/{{ .binary_type }}/
mv docker-registry-{{ .docker_registry_version }}-linux-{{ .binary_type }}.tgz {{ .binary_dir }}/ image-registry/docker-registry/{{ .docker_registry_version }}/{{ .binary_type }}/
```
`binary_type`: 是机器的架构目前支持amd64和arm64可通过 `gather_fact` 自动获取)
`binary_dir`: 软件包存放地址,通常为: `{{ .work_dir}}/kubekey`
### 安装
安装registry需要设置`image_registry.type`值为`registry`
安装registry需要设置`image_registry.type`值为`docker-registry`
1. 安装前检查
```shell
kk precheck image_registry -i inventory.yaml --set image_registry.type=registry --set registry_version=2.8.3,docker_version=24.0.7,dockercompose_version=v2.20.3
kk precheck image_registry -i inventory.yaml --set image_registry.type=docker-registry --set docker_registry_version=2.8.3,docker_version=24.0.7,dockercompose_version=v2.20.3
```
2. 安装
- 单独安装
`image_registry` 可以脱离集群单独进行安装。
```shell
kk init registry -i inventory.yaml --set image_registry.type=registry --set registry_version=2.8.3,docker_version=24.0.7,dockercompose_version=v2.20.3 --set artifact.artifact_url.registry.amd64=registry-2.8.3-linux.amd64.tgz
kk init registry -i inventory.yaml --set image_registry.type=docker-registry --set docker_registry_version=2.8.3,docker_version=24.0.7,dockercompose_version=v2.20.3 --set artifact.artifact_url.docker_registry.amd64=docker-registry-2.8.3-linux.amd64.tgz
```
- 在创建集群时,自动安装
在创建集群时,会检测 `image_registry` 节点是否安装了harbor, 没有安装时会自动根据配置安装harbor
在创建集群时,会检测 `image_registry` 节点是否安装了`docker-registry`, 没有安装时会自动根据配置安装`docker-registry`
```shell
kk create cluster -i inventory.yaml --set image_registry.type=registry --set registry_version=2.8.3,docker_version=24.0.7,dockercompose_version=v2.20.3 --set artifact.artifact_url.registry.amd64=registry-2.8.3-linux.amd64.tgz
kk create cluster -i inventory.yaml --set image_registry.type=docker-registry --set docker_registry_version=2.8.3,docker_version=24.0.7,dockercompose_version=v2.20.3 --set artifact.artifact_url.docker_registry.amd64=docker-registry-2.8.3-linux.amd64.tgz
```
### registry高可用
@ -194,22 +194,22 @@ kubekey暂未提供registry的离线镜像包地址需通过手动打包的
![ha-registry](../../images/ha-registry.png)
- load balancer: 通过docker compose部署keepalived服务实现。
- registry service: 通过docker compose部署registry实现。
- storage service: registry 高可用可通过共享存储的方式来实现。registry 支持多种存储后端,常见的有:
- **filesystem**: 本地存储。默认情况下registry 使用本地磁盘存储镜像数据。如果需要实现高可用,可以将本地存储目 录挂载到 NFS 等共享存储上。配置示例:
- storage service: docker-registry 高可用可通过共享存储的方式来实现。docker-registry 支持多种存储后端,常见的有:
- **filesystem**: 本地存储。默认情况下,docker-registry 使用本地磁盘存储镜像数据。如果需要实现高可用,可以将本地存储目 录挂载到 NFS 等共享存储上。配置示例:
```yaml
image_registry:
registry:
docker_registry:
storage:
filesystem:
rootdir: /opt/registry/data
nfs_mount: /repository/registry # 可选,将 rootdir 挂载到 NFS 服务器
rootdir: /opt/docker-registry/data
nfs_mount: /repository/docker-registry # 可选,将 rootdir 挂载到 NFS 服务器
```
需要在 `nfs` 节点配置和挂载好共享目录,保证所有 registry 实例的数据一致性。
- **azure**: 使用 Azure Blob Storage 作为后端存储。适用于部署在 Azure 云环境下的场景。配置示例:
```yaml
image_registry:
registry:
docker_registry:
storage:
azure:
accountname: <your-account-name>
@ -220,7 +220,7 @@ kubekey暂未提供registry的离线镜像包地址需通过手动打包的
- **gcs**: 使用 Google Cloud Storage 作为后端存储。适用于部署在 GCP 云环境下的场景。配置示例:
```yaml
image_registry:
registry:
docker_registry:
storage:
gcs:
bucket: <your-bucket-name>
@ -230,7 +230,7 @@ kubekey暂未提供registry的离线镜像包地址需通过手动打包的
- **s3**: 使用 Amazon S3 或兼容 S3 协议的对象存储作为后端存储。适用于 AWS 或支持 S3 协议的私有云。配置示例:
```yaml
image_registry:
registry:
docker_registry:
storage:
s3:
accesskey: <your-access-key>