Kubernetes集群安装教程-Ubuntu22.04

安装k8s集群,需要先安装3个软件:kubectl(命令行接口)、kubeadm(集群管理命令工具)和kubelet

首先我们准备环境,以1个master和2个node节点为例。

hostname 系统 配置 IP 组件
vm21 ubuntu22.04 2核4G 10.10.1.21 contrainerd,kubectl,kubeadm,kubelet
vm22 ubuntu22.04 2核2G 10.10.1.22 contrainerd,kubectl,kubeadm,kubelet
vm23 ubuntu22.04 2核2G 10.10.1.23 contrainerd,kubectl,kubeadm,kubelet

1. 系统设置

系统设置部分,3台机器都要

1.1 设置root账号密码

sudo passwd root
# 输入现在的账号密码,然后设定root账号密码
# 切换到 root
su

1.2 安装ssh,开启root登陆

apt install openssh-server
apt install vim 
# 修改配置
vim /etc/ssh/sshd_config 
# PermitRootLogin 选项去掉注释,改成yes:PermitRootLogin yes

1.3 修改安装源

用root账号登陆后。
参考 阿里云 教程:https://developer.aliyun.com/mirror/ubuntu?spm=a2c6h.13651102.0.0.7e311b11FgNIod

vim /etc/apt/sources.list
# 替换成下面的:
deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse

# deb https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse

# 更新系统
apt update
apt upgrade

1. 4 主机名解析,修改host,注意和主机hostname一样

vim /etc/hosts
# 添加下面的,注意原来有的1个删了
10.10.1.21 vm21
10.10.1.22 vm22
10.10.1.23 vm23
hosts

1.5 配置时间同步

apt-get install ntpdate
# 设置阿里云时间服务器
ntpdate time1.aliyun.com

1.6 关闭防火墙

systemctl stop ufw
systemctl disable ufw

1.7 关闭selinux

vim /etc/selinux/config
# 写入以下配置,保存退出
SELINUX=disabled
# 最后重启,检查
reboot
apt install selinux-utils
getenforce

1.8 禁用swap分区

vim /etc/fstab
# 注释掉 /swapfile     none     swap    sw     0     0这一行
#/swapfile     none     swap    sw     0       0
# 重启系统
reboot
# 检查
free -m
swap

1.9 配置网桥和内核转发

# 1.
cat << EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# 2. 上面配置会开机自启,现在也开启
modprobe overlay
modprobe br_netfilter
# 3. 查看
lsmod | egrep "overlay"
lsmod | egrep "br_netfilter"
# 4. 网桥过滤和内核转发追加到 k8s.conf 文件
cat << EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 5. 加载内核参数
sysctl --system
# 6. 查看
sysctl -a | grep ip_forward
网桥

转发

1.10 配置ipvs功能

在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块

apt-get install ipset ipvsadm
# 配置 ipvsadm 模块启动时自动加载
cat << EOF | tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
# 重启
reboot
# 检查
lsmod | grep ip_vs
image.png

1.11 安装Docker

用脚本自动安装的,参考的 南京大学的 开源镜像帮助文档:
https://mirror.nju.edu.cn/mirrorz-help/docker-ce/?mirror=NJU
其实,清华大学的帮助文档也有,但是给的下载脚本的地址国内好像被墙了,github上的有时还能下下来,所以选的南京大学的。
安装好以后设置开机自启:

systemctl enable docker

其实,我们可以不用docker,我们需要的是contrainerd,而安装了docker,contrainerd也就有了。
这里注意一下:containerd的配置需要修改一下

# 1. 生成containerd默认配置,其实现在这个文件是有的,但是内容不全
containerd config default > /etc/containerd/config.toml
# 2. 修改1 在60多行,sandbox_image = "registry.k8s.io/pause:3.6",改成我们kubernetes版本一致的,现在应该是3.9,后面会说怎么看。
# 改成:sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
# 3. 修改2  在130行左右,我这127行,SystemdCgroup = false改成SystemdCgroup = true
# 4. 直接重启吧  reboot

1.12 安装3大组件-kubeadm、kubelet、kubectl

参考阿里云给的方法:https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.78ba1b119Qwd9O
我是打算安装最新的,现在是1.30.3

apt-get install -y apt-transport-https
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key |
    gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ /" |
    tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl

1.13 下载所需镜像

某些原因,镜像下载不好用,我们先用阿里云源,下载下来所需镜像。
官方给了 查询镜像的方法:https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init/

# 查询所需镜像
kubeadm config images list
# 查看阿里云镜像仓库地址中的镜像列表
kubeadm config images list  --image-repository registry.aliyuncs.com/google_containers
# 把阿里镜像源的 那 7个 拉下来 就行了,我这都能拉下来
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.30.3
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.30.3
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.30.3
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.30.3
docker pull registry.aliyuncs.com/google_containers/coredns:v1.11.1
docker pull registry.aliyuncs.com/google_containers/pause:3.9
docker pull registry.aliyuncs.com/google_containers/etcd:3.5.12-0
镜像

1722586005911.png

2. 安装Kubernetes集群

2.1 集群初始化 -- 仅对master节点

使用kubeadm初始化集群

cd /
# 生成kubeadm默认配置文件
kubeadm config print init-defaults > kubeadm-config.yaml
# 2. 修改默认配置
vim kubeadm-config.yaml
  • ip修改为我们master节点ip:localAPIEndpoint.advertiseAddress: 10.10.1.21
  • 修改名称:nodeRegistration.name: vm21
  • 镜像源修改为阿里的:imageRepository: registry.aliyuncs.com/google_containers
  • kubernetesVersion修改:kubernetesVersion: 1.30.3
  • 添加networking.podSubnet:networking.podSubnet: 10.244.0.0/16
  • 文件末尾添加cgroup(有分隔符):
    ---
    kind: KubeletConfiguration
    apiVersion: kubelet.config.k8s.io/v1beta1
    cgroupDriver: systemd
    

上面已经下载好镜像了,初始化配置文件也修改了,进行初始化:

# 初始化命令
kubeadm init --config kubeadm-config.yaml
初始化成功

初始化成功以后,需要配置一下系统,截图上已经给了,上面还给出了其他节点加入集群的命令,要记录下来用。我是root,但也执行了这个:

# 主要是吧 命令加到环境变量中,不然kubectl命令报错
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

 export KUBECONFIG=/etc/kubernetes/admin.conf

初始化以后,查看节点和pod是这样的。

kubectl get nodes
kubectl get pod -A
1722589125196.png

2.2 添加node节点

上面初始化时已经生成了加入命令了(不记得了用这个生成:kubeadm token create --print-join-command),我们只需要在node节点执行就可以了
分别在另外2台机器执行:

kubeadm join 10.10.1.21:6443 --token 42hek0.a24j8outjbvv7lkg --discovery-token-ca-cert-hash sha256:d038e3cf2d2af889bf43f3fcdf70f028f014c3bc26a1784d76b248b070bf8e41
image.png

修改一下节点角色,master执行:

kubectl label node vm22 node-role.kubernetes.io/worker=worker
kubectl label node vm23 node-role.kubernetes.io/worker=worker
image.png

3. 安装网络插件

从上面pod可以看见,coredns 停滞在 Pending 状态。这是正常的。
官网是这么说的:这一行为是预期之中的,因为系统就是这么设计的。kubeadm 的网络供应商是中立的, 因此管理员应该选择安装 Pod 的网络插件。 你必须完成 Pod 的网络配置,然后才能完全部署 CoreDNS。 在网络被配置好之前,DNS 组件会一直处于 Pending 状态。

3.1 网络插件

常见的网络插件有Flannel、Calico 、Cilium 。

  • Flannel 适合小规模集群
  • Calico 是一套开源的纯三层的虚拟化网络解决方案,是目前K8s主流的网络方案。它把每个节点都作为一个虚拟路由器,把Pod当做路由器上一个终端设备为其分配一个IP地址,通过BGP协议生成路由规则,实现不同节点上的Pod网络互通。既适合小规模也适合大规模,部署也比较容易。


    引自 https://blog.csdn.net/BlogPan/article/details/133513076
  • Cilium 对内核的版本要求较高,内核版本必须要达到6.3以上
    这里我们选用Calico。

3.2 安装Calico

Calico官网文档:https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart

3.2.1 版本选择

首先我们要查询一下和我们K8s版本对应的Calico版本。在Calico的系统需求里面能找到。Calico v3.28里面能找到K8s v1.30版本。

3.2.2 快速安装

然后,根据Calico的快速开始文档就可以安装了。注意,是在 master节点。文档一共5步,我们按顺序来:

    1. 配置tigera-operator命名空间
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/tigera-operator.yaml

tigera-operator

执行完以后,可以用命令(kubectl get ns)查看到tigera-operator命名空间已经好了并且运行正常。

    1. 配置安装Calico

下载下来custom-resources.yaml文件,将网段改成10.244.0.0/16(因为前面k8s初始化的时候设置的pod网段就是这个)。

cd /
wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/custom-resources.yaml

cidr

安装这个和初始化k8s差不多的,也是需要镜像。所以,我们需要先准备镜像。
注意!注意!注意!
反正这我是踩了一天的坑!一开始用的docker镜像,总是出问题,明明镜像在那,还说拉取不下来,一着急docker镜像删了,用ctr(contrainerd带的命令行工具)重新拉取,这才能用了。所以不要拉docker镜像了,直接ctr。

  1. 先说需要哪些镜像?7个,别问怎么知道的,4种pod节点我一个个试出来的,每次running不成功看看是什么


    4种pod
  2. 直接拉取不一定成功,先设置加速地址(不知道有没有用),然后拉取
    加速地址

    我是从这个里面挑了2个加进去了:https://github.com/DaoCloud/public-image-mirror/issues/2328
    镜像拉取命令(3个node都要拉!3个node都要拉!3个node都要拉!):
#  node类型pod中3个
ctr image pull docker.1panel.live/calico/cni:v3.28.1
ctr image pull docker.1panel.live/calico/pod2daemon-flexvol:v3.28.1
ctr image pull docker.1panel.live/calico/node:v3.28.1
# node-driver类型pod中2个
ctr image pull docker.1panel.live/calico/csi:v3.28.1
ctr image pull docker.1panel.live/calico/node-driver-registrar:v3.28.1
# typha类型pod中1个
ctr image pull docker.1panel.live/calico/typha:v3.28.1
# controller类型pod中1个
ctr image pull docker.1panel.live/calico/kube-controllers:v3.28.1
# 这是后来又出现的calico-apiserver 命名空间中需要的
ctr image pull  docker.1panel.live/calico/apiserver:v3.28.1
calico镜像

镜像拉下来以后,执行creat命令(master节点就行):

kubectl create -f custom-resources.yaml
    1. 查看安装结果

上面执行完以后,我们看一下命名空间和pod

kubectl get ns
kubectl get pods -A
kubectl get nodes
所有pod

所有node

这里补充2个实用命令:

# 查看pod情况描述的,包含了ip和镜像以及报错的日志
kubectl describe pod calico-apiserver-77c695bdb6-6bqrn -n calico-apiserver
# 这个是删除pod的,拉取镜像后,删除pod,会自动重建pod,就好了
kubectl delete pod calico-apiserver-77c695bdb6-6bqrn -n calico-apiserver

到这里,K8s基本安装完成了,节点和pod都正常运行了。

4. 部署nginx测试

K8s里面有 service 的概念,service是盒一组Pod关联的。当我们部署服务以后,多了一组pod,同时也会多一个service,定义了访问服务的ip、端口等信息。
查看命令:kubectl get service。我们先来看一下现在的:

service

    1. 创建nginx配置文件
vim nginx-deployment.yaml
    1. 添加如下配置:
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mynginx # 部署的名称
spec:
  replicas: 2  # 设置副本数量为2
  selector:
    matchLabels:
      app: mynginx1 # 用于选择匹配的Pod标签
  template:
    metadata:
      labels:
        app: mynginx1 # Pod的标签
    spec:
      containers:
      - name: nginx # 容器名称
        image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest # 镜像拉取地址,换成阿里云的,不然会拉取失败
        imagePullPolicy: IfNotPresent # 镜像拉取策略,如果本地没有就拉取
        ports:
        - containerPort: 80 # 容器内部监听的端口
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service # 服务的名称
spec:
  externalTrafficPolicy: Cluster # 外部流量策略设置为集群
  selector:
    app: mynginx1 # 用于选择匹配的Pod标签
  ports:
  - protocol: TCP # 使用TCP协议
    port: 80 # 服务暴露的端口
    targetPort: 80 # Pod中容器的端口
    nodePort: 30080 # 在每个Node上分配的端口,用于外部访问
  type: NodePort # 服务类型,使用NodePort
    1. 应用配置
kubectl apply -f nginx-deployment.yaml
    1. 查看
kubectl get pods -o wide
kubectl get service
nginx服务
    1. 访问
      访问分集群内部,外部访问,我们试一下。
      内部:curl 10.100.196.101
      内部访问

      外部,外部访问从每个节点都可以,每个节点 ip不一样,端口都是一样的:
      外部访问
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容