Kubernetes on AWS EC2 with Debian Bookworm (Doesn't Work)
Updated: November 17, 2024This doesn't work. I tried to tinker with it. "/etc/containerd/config.toml" had disabled_plugins = ["cri"], so I change it to an empty array. On AWS EC2, I had to get the hostname to resolve (that's why the resolvectl and append to /etc/hosts). It needs more troubleshooting.
sudo apt-get update
sudo apt-get install -y ca-certificates curl wget gpg bind9-utils bind9-dnsutils net-tools
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
FQDN=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/hostname)
HOSTNAME=$(echo $FQDN | cut -d'.' -f 1)
DOMAIN=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/placement/region).compute.internal
MACADDR=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/network/interfaces/macs)
IPADDR=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/network/interfaces/macs/$MACADDR/public-ipv4s)
echo "127.0.0.1 $HOSTNAME" | sudo tee -a /etc/hosts
IFACE=$(resolvectl domain | grep ens | cut -d '(' -f 2 | cut -d ')' -f 1)
sudo resolvectl domain $IFACE ${DOMAIN}.compute.internal
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
#VER=$(curl -s https://api.github.com/repos/Mirantis/cri-dockerd/releases/latest|grep tag_name | cut -d '"' -f 4|sed 's/v//g')
wget $(curl -s https://api.github.com/repos/Mirantis/cri-dockerd/releases/latest | grep bullseye | grep browser_download_url | cut -d '"' -f 4)
sudo dpkg -i cri-dockerd_*.debian-bullseye_amd64.deb
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold docker-ce kubelet kubeadm kubectl
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
sudo swapoff -a # Also remove the swap partition from /etc/fstab
#sudo kubeadm init --apiserver-advertise-address=__control_plane_ip__ --cri-socket unix:///var/run/cri-dockerd.sock --pod-network-cidr=192.168.0.0/16
# Unblock ports 6443 and maybe also 10240-10260
#sudo kubeadm token create --print-join-command
#sudo kubeadm join __control_plane_ip__:6443 --token 31rvbl.znk703hbelja7qbx --cri-socket unix:///var/run/cri-dockerd.sock --discovery-token-ca-cert-hash sha256:3dd5f401d1c86be4axxxxxxxxxx61ce965f5xxxxxxxxxxf16cb29a89b96c97dd # This is to add data nodes (optional)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes # Wait till the node status is Ready
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/tigera-operator.yaml
curl https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/custom-resources.yaml -O
kubectl create -f custom-resources.yaml