Ваше понимание верно: с копами вы не можете изменять блоки CIDR существующего кластера; он застрял в VPC, в котором он был создан, и вы не можете изменить блок CIDR VPC :
Диапазон IP-адресов VPC состоит из связанных блоков CIDR.
с этим. Вы выбираете один блок CIDR при создании VPC, и вы
можете добавить или удалить вторичные блоки CIDR позже. Блок CIDR, который вы
добавить при создании VPC нельзя изменить , но вы можете добавить и
удалить вторичные блоки CIDR, чтобы изменить диапазон IP-адресов
VPC. (выделение мое)
Это подводит нас ко второму пункту: миграции вашего кластера. Это можно разбить на две фазы:
- Перенос инфраструктуры, управляемой
kops
- Перенос рабочих нагрузок в кластере
1. Миграция инфраструктуры, управляемой kops
Вам потребуется перенести (т. Е. Заново создать) сам кластер kops: экземпляры ec2, объекты kops InstanceGroups
и Cluster
, различную инфраструктуру AWS и т. Д. Для этого вы можете использовать команду kops toolbox template
:
kops toolbox template --values /path/to/values.yaml --template /path/to/cluster/template.yaml > /path/to/output/cluster.yaml
kops create -f /path/to/output/cluster.yaml
Это инструмент, похожий на шлем, который позволяет вам шаблонизировать конфигурацию вашего кластера kops и передавать в различные файлы values.yaml
. Возможно, вы захотите включить эту команду в небольшую оболочку сценария оболочки или Makefile, чтобы создать кластерные развертывания в один клик, чтобы легко и с повторением настроить инфраструктуру кластера k8s.
Пример файла кластера template.yaml и файла values.yaml может выглядеть следующим образом, включая спецификации для Cluster
, а также master, worker и autoscale InstanceGroup
s.
# template.yaml
{{ $clusterSubdomain := (env "CLUSTER_SUBDOMAIN") }}
{{ $subnetCidr := (env "SUBNET_CIDR") }}
apiVersion: kops/v1alpha2
kind: Cluster
metadata:
name: {{ $clusterSubdomain }}.k8s.example.io
spec:
hooks:
- manifest: |
[Unit]
Description=Create example user
ConditionPathExists=!/home/example/.ssh/authorized_keys
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'useradd example && echo "{{ .examplePublicKey }}" > /home/example/.ssh/authorized_keys'
name: useradd-example.service
roles:
- Node
- Master
- manifest: |
Type=oneshot
ExecStart=/usr/bin/coreos-cloudinit --from-file=/home/core/cloud-config.yaml
name: reboot-window.service
roles:
- Node
- Master
kubeAPIServer:
authorizationRbacSuperUser: admin
featureGates:
TaintBasedEvictions: "true"
kubeControllerManager:
featureGates:
TaintBasedEvictions: "true"
horizontalPodAutoscalerUseRestClients: false
kubeScheduler:
featureGates:
TaintBasedEvictions: "true"
kubelet:
featureGates:
TaintBasedEvictions: "true"
fileAssets:
- content: |
yes
name: docker-1.12
path: /etc/coreos/docker-1.12
roles:
- Node
- Master
- content: |
#cloud-config
coreos:
update:
reboot-strategy: "etcd-lock"
locksmith:
window-start: {{ .locksmith.windowStart }}
window-length: {{ .locksmith.windowLength }}
name: cloud-config.yaml
path: /home/core/cloud-config.yaml
roles:
- Node
- Master
api:
dns: {}
authorization:
rbac: {}
channel: stable
cloudProvider: aws
configBase: s3://my-bucket.example.io/{{ $clusterSubdomain }}.k8s.example.io
etcdClusters:
- etcdMembers:
- instanceGroup: master-{{ .zone }}
name: a
name: main
- etcdMembers:
- instanceGroup: master-{{ .zone }}
name: a
name: events
iam:
allowContainerRegistry: true
legacy: false
kubernetesApiAccess:
- {{ .apiAccessCidr }}
kubernetesVersion: {{ .k8sVersion }}
masterPublicName: api.{{ $clusterSubdomain }}.k8s.example.io
networkCIDR: {{ .vpcCidr }}
networkID: {{ .vpcId }}
networking:
canal: {}
nonMasqueradeCIDR: 100.64.0.0/10
sshAccess:
- {{ .sshAccessCidr }}
subnets:
- cidr: {{ $subnetCidr }}
name: {{ .zone }}
type: Public
zone: {{ .zone }}
topology:
dns:
type: Public
masters: public
nodes: public
---
apiVersion: kops/v1alpha2
kind: InstanceGroup
metadata:
labels:
kops.k8s.io/cluster: {{ $clusterSubdomain }}.k8s.example.io
name: master-{{ .zone }}
spec:
{{- if .additionalSecurityGroups }}
additionalSecurityGroups:
{{- range .additionalSecurityGroups }}
- {{ . }}
{{- end }}
{{- end }}
image: {{ .image }}
machineType: {{ .awsMachineTypeMaster }}
maxSize: 1
minSize: 1
nodeLabels:
kops.k8s.io/instancegroup: master-{{ .zone }}
role: Master
subnets:
- {{ .zone }}
---
apiVersion: kops/v1alpha2
kind: InstanceGroup
metadata:
labels:
kops.k8s.io/cluster: {{ $clusterSubdomain }}.k8s.example.io
name: nodes
spec:
{{- if .additionalSecurityGroups }}
additionalSecurityGroups:
{{- range .additionalSecurityGroups }}
- {{ . }}
{{- end }}
{{- end }}
image: {{ .image }}
machineType: {{ .awsMachineTypeNode }}
maxSize: {{ .nodeCount }}
minSize: {{ .nodeCount }}
nodeLabels:
kops.k8s.io/instancegroup: nodes
role: Node
subnets:
- {{ .zone }}
---
apiVersion: kops/v1alpha2
kind: InstanceGroup
metadata:
name: ag.{{ $clusterSubdomain }}.k8s.example.io
labels:
kops.k8s.io/cluster: {{ $clusterSubdomain }}.k8s.example.io
spec:
{{- if .additionalSecurityGroups }}
additionalSecurityGroups:
{{- range .additionalSecurityGroups }}
- {{ . }}
{{- end }}
{{- end }}
image: {{ .image }}
machineType: {{ .awsMachineTypeAg }}
maxSize: 10
minSize: 1
nodeLabels:
kops.k8s.io/instancegroup: ag.{{ $clusterSubdomain }}.k8s.example.io
role: Node
subnets:
- {{ .zone }}
И файл values.yaml:
# values.yaml:
region: us-west-2
zone: us-west-2a
environment: staging
image: ami-abc123
awsMachineTypeNode: c5.large
awsMachineTypeMaster: m5.xlarge
awsMachineTypeAg: c5.large
nodeCount: "2"
k8sVersion: "1.9.3"
vpcId: vpc-abc123
vpcCidr: 172.23.0.0/16
apiAccessCidr: <e.g. office ip>
sshAccessCidr: <e.g. office ip>
additionalSecurityGroups:
- sg-def234 # kubernetes-standard
- sg-abc123 # example scan engine targets
examplePublicKey: "ssh-rsa ..."
locksmith:
windowStart: Mon 16:00 # 8am Monday PST
windowLength: 4h
2. Миграция рабочих нагрузок в кластере
Не имея практического опыта работы с Ark, похоже, он хорошо подходит для вашего случая использования :
Миграция кластера
Использование резервных копий и восстановлений
Heptio Ark может помочь вам перенести ресурсы с одного кластера на
другой, пока вы указываете каждый параметр Ark Config на один и тот же облачный объект
место хранения. В этом сценарии мы также предполагаем, что ваши кластеры
размещены на том же облачном провайдере. Обратите внимание, что Heptio Ark не
поддержка миграции постоянных томов между облачными провайдерами.
(Cluster 1) Assuming you haven’t already been checkpointing your data with the Ark schedule operation, you need to first back up your
весь кластер (замена по желанию):
ark backup create <BACKUP-NAME>
The default TTL is 30 days (720 hours); you can use the --ttl flag to change this as necessary.
(Cluster 2) Make sure that the persistentVolumeProvider and backupStorageProvider fields in the Ark Config match the ones from
Кластер 1, так что ваш новый экземпляр сервера Ark указывает на
такое же ведро.
(Cluster 2) Make sure that the Ark Backup object has been created. Ark resources are synced with the backup files available in cloud
хранение.
(Cluster 2) Once you have confirmed that the right Backup (<BACKUP-NAME>) is now present, you can restore everything with:
ark restore create --from-backup <BACKUP-NAME>
Настройка Ark на кластерах AWS кажется достаточно простой: https://github.com/heptio/ark/blob/master/docs/aws-config.md.
При первоначальной настройке со сценарием kops toolbox и конфигурацией Ark у вас должен быть чистый, повторяемый способ перенести кластер и превратить домашних животных в крупного рогатого скота, как мем.