基于Docker部署Kubernetes

学习环境架构搭建

创建VPC

在AWS创建一个拥有一个子网的VPC

image-20240629213836702

创建安全组

安全组为了方便最好把ssh的22端口以及Kubernetes API服务的端口6443设置为入站规则。

image-20240629214700104

启动模板创建

根据最小配置。

image-20240629214828795

编写用户数据。

#!/bin/bash

# 更新系统软件包
apt-get update

# 安装Docker
apt-get install -y docker.io
systemctl start docker
systemctl enable docker

# 添加Kubernetes官方APT软件仓库的密钥和仓库
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list

# 更新APT索引并安装kubelet, kubeadm和kubectl
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

# 关闭Swap(Kubernetes不支持运行在启用了Swap的机器上)
swapoff -a
sed -i '/ swap / s/^/#/' /etc/fstab

问题来了,当我试图用用户数据来做启动后的自动安装配置,由于Ubuntu版本命令已经不用apt-key了,所以在实例启动后并没有得到相应的环境,不过没有问题。

Master主节点

配置主节点环境以及准备初始化主节点

1. 安装docker

# 更新本地的包索引数据库,这样在安装新软件时能获取到最新的软件包。
sudo apt-get update
# 安装Docker。docker.io是Ubuntu官方仓库中Docker的软件包名称,-y参数表示自动同意安装过程中的询问。
sudo apt-get install docker.io -y
# 启动Docker服务,并设置为开机自启动。
sudo systemctl enable --now docker

2.关闭Swap

# 禁用swap(交换空间)。Kubernetes要求禁用swap,因为需要严格的资源控制和隔离,swap存在可能会影响性能和调度决策。
sudo swapoff -a

3.安装 cri-dockerd

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd_0.3.4.3-0.ubuntu-jammy_amd64.deb
# cri-dockerd是一个桥接组件,允许Kubernetes通过CRI(容器运行时接口)与Docker交互。
dpkg -i cri-dockerd_0.3.4.3-0.ubuntu-jammy_amd64.deb

4.启动并配置开机启动 cri-dockerd

sudo systemctl enable --now cri-docker.service
sudo systemctl enable --now cri-docker.socket
  • 这些命令设置cri-docker服务和socket的启动和开机自启动,确保Kubernetes可以正确与Docker通信。

5.安装 kubeadm、kubelet、kubectl

sudo apt-get update
# 安装网络传输和证书相关的工具,为后续下载和验证Kubernetes包做准备。
sudo apt-get install -y apt-transport-https ca-certificates curl
# 下载并安装Kubernetes的GPG密钥,用于验证后续安装包的完整性。
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
# 添加Kubernetes的软件源,以便安装kubeadm、kubelet和kubectl。
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] http://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main" | 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 kubelet kubeadm kubectl
  • 测试拉取,然后查看需要的images

image-20240630104435917

  • 拉取镜像
sudo docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.27.4
sudo docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.27.4
sudo docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.27.4
sudo docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.27.4
sudo docker pull registry.aliyuncs.com/google_containers/pause:3.9
sudo docker pull registry.aliyuncs.com/google_containers/etcd:3.5.7-0
sudo docker pull registry.aliyuncs.com/google_containers/coredns:v1.10.1
  • 修改配置文件

image-20240630111103161

第一次尝试初始化

粗心大意,podSubnet没有注意大小写

image-20240630113034682

第二次尝试初始化

需要reset一下kubeeadm

# 我们用的是docker
sudo kubeadm reset -f --cri-socket unix:///run/cri-dockerd.sock

image-20240630114542529

验证

出现了两个问题,总的来说就是权限问题和连接问题.

image-20240630115125908

权限问题解决
sudo chown ubuntu:ubuntu /etc/kubernetes/admin.conf

解决完权限问题后,连接问题也解决了

image-20240630115354437

经过一定的搜寻和思考,

  • 运行上述命令后,你实际上是在改变 /etc/kubernetes/admin.conf 文件的所有权,将其从 root 用户和组更改为 ubuntu 用户和组。这样做的直接结果是,普通用户 ubuntu 现在有权限读取这个文件。
  • 在k8s中集群中,admin.conf 文件包含了连接到集群的 K8s API 服务器的必要凭证和连接信息。这包括 API 服务器的地址、端口、使用的证书等。当你以 ubuntu 用户身份运行 kubectl 命令时,kubectl 会尝试读取这个配置文件来获取连接到 K8s 集群的必要信息。

先观察一下kubelet日志

sudo journalctl -u kubelet -f

image-20240630120005623

再看一眼pod的日志

# 指定namespace;
sudo kubectl logs coredns-5dd5756b68-jd25s --namespace=kube-system

这种情况,大概率是网络上的,问题,经过查找需要安装一些网络插件

image-20240630121445618

安装部署 Calico 网络插件

# 安装
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
# 部署
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml

Node 节点加入集群

先在master节点查看加入命令

sudo kubeadm token create --print-join-command
# 加入命令,并指定cri-socket
kubeadm join 10.0.1.237:6443 --token a69ewm.uvje3ei8zhox3xar --discovery-token-ca-cert-hash sha256:64db0e4e2ddc13e1a06390ac6b90b4f38a965fdc7cbfd2e3baa80a668e7cd74d --cri-socket unix:///run/cri-dockerd.sock

为了node节点加入必备组件

成功后会显示

image-20240630124600952

然后主节点查看加入集群的节点

image-20240630125420559

ps:如果报couldn’t get current server API group list: Get “http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused的话,大概率是终端断连导致之前export的环境变量失效了,可以在/etc/environment文件中加入KUBECONFIG=”/etc/kubernetes/admin.conf”以使环境变量永久生效