|
#!/usr/bin/bash |
|
|
|
KUBERNETES_VERSION="1.26.0" |
|
DEBIAN_FRONTEND=noninteractive |
|
TOKEN="abcdef.0123456789abcdef" |
|
|
|
apt-get update |
|
apt-get install -y apt-transport-https ca-certificates curl \ |
|
conntrack iptables iproute2 ethtool util-linux mount ebtables kmod \ |
|
libseccomp2 pigz nfs-common open-iscsi ca-certificates jq vim |
|
|
|
# Configure system |
|
cat > /etc/sysctl.d/99-kubernetes-cri.conf <<EOF |
|
net.bridge.bridge-nf-call-iptables = 1 |
|
net.ipv6.conf.all.forwarding = 1 |
|
net.bridge.bridge-nf-call-ip6tables = 1 |
|
EOF |
|
sysctl --system |
|
|
|
# Install kubernetes packages |
|
curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg |
|
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list |
|
|
|
apt-get update |
|
apt-get install -y kubelet kubeadm kubectl |
|
apt-mark hold kubelet kubeadm kubectl |
|
|
|
echo "Enabling kubelet ... " \ |
|
&& systemctl enable kubelet.service |
|
|
|
# Install containerd |
|
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg |
|
echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ |
|
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null |
|
apt-get update |
|
apt-get -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
|
|
|
containerd config default > /etc/containerd/config.toml |
|
sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml |
|
systemctl restart containerd |
|
|
|
echo "runtime-endpoint: unix:///run/containerd/containerd.sock" > /etc/crictl.yaml |
|
|
|
# Configure kubeadm |
|
IPV6_ADDRESS=$( ip -6 addr show dev ens4 | grep inet6 | grep global | awk '{print $2}' | cut -d\/ -f1 ) |
|
SERVICE_SUBNET="${IPV6_ADDRESS}1:0/112" |
|
POD_SUBNET="${IPV6_ADDRESS}2:0/112" |
|
|
|
mkdir -p /etc/kubernetes/manifests |
|
cat > /etc/kubernetes/cloud-config <<EOF |
|
[Global] |
|
project-id = "my-beautiful-project-39276" |
|
node-tags = nodeports |
|
node-instance-prefix = "kubernetes-node" |
|
multizone = true |
|
EOF |
|
|
|
cat > /opt/kubeadm.yaml <<EOF |
|
apiVersion: kubeadm.k8s.io/v1beta3 |
|
kind: InitConfiguration |
|
bootstrapTokens: |
|
- groups: |
|
- system:bootstrappers:kubeadm:default-node-token |
|
token: ${TOKEN} |
|
ttl: 24h0m0s |
|
usages: |
|
- signing |
|
- authentication |
|
localAPIEndpoint: |
|
advertiseAddress: "::" |
|
bindPort: 6443 |
|
nodeRegistration: |
|
criSocket: unix:///var/run/containerd/containerd.sock |
|
imagePullPolicy: IfNotPresent |
|
name: node |
|
kubeletExtraArgs: |
|
fail-swap-on: "false" |
|
node-ip: "::" |
|
--- |
|
apiVersion: kubeadm.k8s.io/v1beta3 |
|
kind: ClusterConfiguration |
|
clusterName: ipv6-cluster |
|
apiServer: |
|
extraArgs: |
|
bind-address: "::" |
|
controllerManager: |
|
extraArgs: |
|
configure-cloud-routes: "false" |
|
bind-address: "::" |
|
scheduler: |
|
extraArgs: |
|
bind-address: "::1" |
|
certificatesDir: /etc/kubernetes/pki |
|
etcd: |
|
local: |
|
dataDir: /var/lib/etcd |
|
imageRepository: registry.k8s.io |
|
kubernetesVersion: ${KUBERNETES_VERSION} |
|
networking: |
|
dnsDomain: cluster.local |
|
serviceSubnet: "${SERVICE_SUBNET}" |
|
--- |
|
apiVersion: kubelet.config.k8s.io/v1beta1 |
|
kind: KubeletConfiguration |
|
metadata: |
|
name: config |
|
failSwapOn: false |
|
address: "::" |
|
healthzBindAddress: "::" |
|
--- |
|
apiVersion: kubeproxy.config.k8s.io/v1alpha1 |
|
kind: KubeProxyConfiguration |
|
metadata: |
|
name: config |
|
detectLocalMode: "InterfaceNamePrefix" |
|
detectLocal: |
|
interfaceNamePrefix: "veth" |
|
EOF |
|
|
|
/usr/bin/kubeadm init --config /opt/kubeadm.yaml --ignore-preflight-errors=all -v4 |
|
sleep 5 |
|
|
|
# Use Google Public DNS64 https://developers.google.com/speed/public-dns/docs/dns64 |
|
original_coredns=$(kubectl get -oyaml -n=kube-system configmap/coredns) |
|
echo "Original CoreDNS config:" |
|
echo "${original_coredns}" |
|
# Patch it |
|
fixed_coredns=$( printf '%s' "${original_coredns}" | sed 's/resolv.conf/[2001:4860:4860::6464]:53/' ) |
|
echo "Patched CoreDNS config:" |
|
echo "${fixed_coredns}" |
|
printf '%s' "${fixed_coredns}" | kubectl apply -f - |
|
|
|
|
|
cat > /etc/cni/net.d/10-kindnet.conflist <<EOF |
|
{ |
|
"cniVersion": "0.3.1", |
|
"name": "kindnet", |
|
"plugins": [ |
|
{ |
|
"type": "ptp", |
|
"ipMasq": false, |
|
"ipam": { |
|
"type": "host-local", |
|
"dataDir": "/tmp/cni-ipam-state", |
|
"routes": [ |
|
{ "dst": "::/0" } |
|
], |
|
"ranges": [ |
|
[ { "subnet": "${POD_SUBNET}" } ] |
|
] |
|
} |
|
, |
|
"mtu": 1500 |
|
}, |
|
{ |
|
"type": "portmap", |
|
"capabilities": { |
|
"portMappings": true |
|
} |
|
} |
|
] |
|
} |
|
EOF |
|
|