ubuntu安装k8s

准备工作

系统准备

本次安装 Kubernetes 是在 Ubuntu Server 22.04.4 LTS 版本的操作系统,请提前下载和安装好操作系统,系统下载地址:
官方下载地址 (不固定):
复制代码
https://releases.ubuntu.com/22.04.4/ubuntu-22.04.4-live-server-amd64.iso
阿里云下载地址:
复制代码
https://mirrors.aliyun.com/ubuntu-releases/jammy/ubuntu-22.04-live-server-amd64.iso
关于设置主机名,可以考虑在按照操作系统的时候进行设置:

软件包准备

本次使用的容器运行时为 containerd,对应版本官方下载地址:
复制代码
https://github.com/containerd/containerd/releases/download/v1.7.13/cri-containerd-cni-1.7.13-linux-amd64.tar.gz

主机和IP地址准备

本次总共创建了三台主机,配置为 2c2g40g,IP地址如下:
IP地址 主机名字 用途
172.18.8.150/16 k8s-control-plane k8s 控制平面接点(主节点)
172.18.8.151/16 k8s-worker01 k8s 工作节点1
172.18.8.152/16 k8s-worker02 k8s 工作节点2
复制代码
172.18.0.0/16
255.255.0.0
​

安装步骤

安装前准备

关闭防火墙

执行下面命令永久关闭防火墙:
复制代码
# 关闭防火墙
sudo systemctl disable --now ufw
# 查看防火墙的状态
sudo systemctl status ufw

设置服务器时区

Ubuntu安装完成之后默认不是中国时区,需要执行以下命令设置为中国上海时区:
复制代码
# 查看时间命令
date
# 设置为亚洲的上海时区
sudo timedatectl set-timezone Asia/Shanghai
# 重启时间同步服务
sudo systemctl restart systemd-timesyncd.service
# 确保时间同步服务正常运动 查看时间服务的状态
timedatectl status

关闭 swap 分区

需要关闭所有 swap 分区,可以修改 /etc/fstab 文件:
复制代码
sudo vi /etc/fstab  永久关闭 swap 分区
注释掉带 swap 的这一行
上面是永久关闭,下面可以执行这行命令临时关闭
复制代码
# 临时关闭 swap
sudo swapoff  -a

# 查看 swap 是否已经被关闭
free -h  

关闭 SELinux

Ubuntu 默认关闭了 selinux,通过以下命令确保 selinux 已关闭
复制代码
# 安装 policycoreutils 软件包
sudo apt install -y policycoreutils
# 检查 selinux 关闭状态
sestatus
可以看到所有服务器 selinux 已关闭:

配置 hosts 配置文件

需要修改 /etc/hosts 配置文件,通过下面命令:
复制代码
sudo vim /etc/hosts
然后注释掉原来的主机名称配置,并将下面这几行解析添加到文件最后(注意修改为自己的IP地址):
复制代码
172.18.8.150 k8s-control-plane
172.18.8.151 k8s-worker01
172.18.8.152 k8s-worker02

转发 IPV4 并让 iptables 看到桥接流量

执行下述指令:这些命令都是从kubelet官网复制下来的
复制代码
永久去加载 overlay 和 br_netfilter 这两模块

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
# 将 ipv6 和 ipv4 的转发开启
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_forword = 1
EOF

# 应用 sysctl 参数而不重新启动
sudo sysctl --system
通过运行以下指令确认 br_netfilter 和 overlay 模块被加载:
复制代码
lsmod | grep br_netfilter
lsmod | grep overlay
通过运行以下指令确认 net.bridge.bridge-nf-call-iptables,net.bridge.bridge-nf-call-ip6tables 和 net.ipv4.ip_forward系统变量在你的 sysctl 配置中被设置为1:
复制代码
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

iptables 看到桥接流量

安装容器运行时

本次安装的是 containerd 的容器运行时,下载地址:
复制代码
https://github.com/containerd/containerd/releases/download/v1.7.13/cri-containerd-cni-1.7.13-linux-amd64.tar.gz,
# 可以通过下面命令进行下载:
curl -LO https://github.com/containerd/containerd/releases/download/v1.7.13/cri-containerd-cni-1.7.13-linux-amd64.tar.gz
# 然后解压到根目录:
sudo tar -zxvf cri-containerd-cni-1.7.13-linux-amd64.tar.gz -C /
# 然后可以通过下面这行命令查看安装的版本:
containerd -v


# 同步命令
scp longchi@172.18.8.150:/home/longchi/cri-containerd-cni-1.7.13-linux-amd64.tar.gz


# 通过下面命令创建配置文件目录
sudo mkdir /etc/containerd

# 然后通过下面命令先将配置文件创建出来:
containerd config default | sudo tee /etc/containerd/config.toml

# 然后修改一下这个文件:
sudo vim /etc/containerd/config.toml
1.大概在65行位置修改 sandbox_image 值为 registry.aliyuncs.com/google_containers/pause:3.9

2. 大概在137行位置将 SystendCgroup 的值修改为 true
然后保存退出之后通过下面命令启动 containerd:
sudo systemctl enable --now containerd # 开机自启
# 查看containerd 的状态
sudo systemctl status containerd

安装 Kubernetes

配置并安装 apt 包
以下内容直接在官网复制,安装的 1.28 版本:
官网地址:Kubernetes
复制代码
https://kubernetes.io/
https://v1-28.docs.kubernetes.io/zh-cn/docs/home/
更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包:
复制代码
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
下载用于 Kubernetes 软件包仓库的公共签名密钥,所有仓库都使用相同的签名密钥,因此你可以忽略URL中的版本:
复制代码
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
添加kubernetes apt 仓库,请注意,次仓库仅包含适用于 Kubernetes1.28 的软件包:对于其他 kubernetes 次要版本,则需要更改 URL中 Kubernetes 次要版本以匹配你所需的次要版本(你还应该检查正在阅读的安装文档是否为你计划安装的 Kubernetes 版本的文档)。
复制代码
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
更新 apt 包索引,安装 kubelet, kubeadm, 和 kubectl, 并锁定其版本:
复制代码
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
通过下面命令查看安装的 kubeadm 版本:
复制代码
kubeadm version

# 配置文件
sudo vim /etc/containersd/config.toml
可以看到安装的是 v1.28.7 版本:

配置并安装 apt 包

初始化集群

上一步已经确定了安装了v1.28.7的版本,接下来可以在主节点上执行这行命令将主节点的镜像拉取下来:
以下命令只在主节点执行:
复制代码
sudo kubeadm config images pull \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.28.7 \
--cri-socket=unix://run/containerd/containerd.sock
执行如图:
接下来通过下面命令初始化集群(注意修改主节点IP地址和版本等):
复制代码
sudo kubeadm init \
--apiserver-advertise-address=172.18.8.150 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=1.28.7 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=100244.0.0/16 \
--cri-socket=unix:///run/containerd/containerd.sock
执行结果如下:​
首先在本机上执行这三行命令:
复制代码
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
然后在所有工作节点上执行这行命令(注意修改为自己的 token), 注意后面拼接上 --cri-socket=unix:///var/run/containerd/containerd.sock 参数:
以下命令是在任意数量的工作节点执行(目的是让节点和主节点建立联系)
复制代码
sudo kubeadm join 172.18.8.150:6443 --token kxz9ng.mhm3zut1x80phcsd \
	--discovery-token-ca-cert-hash sha256:f.... \
	--cri-socket=unix:///run/containerd/containerd.sock
然后可以通过命令在主节点上查看所有节点:(在主节点执行下面这条命令 打印各节点详细信息)
复制代码
kubectl get nodes -o wide
可以查看执行结果,获取了所有节点:
复制代码

安装 calico 网络插件

该步骤依照官网,calico官网地址:
复制代码
https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart
安装 Tigera Calico 操作符和自定义资源定义:
复制代码
# 这条命令在主节点执行
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.2/manifests/tigera-operator.yaml
可以看到创建成功:
复制代码
# 查看资源创建情况
kubectl get all -o wide -n tigera-operator
接下来需要安装必须的客户端资源,因为我们 pod 的网段与 calico 官网不相同,所以先将这个文件下载下来然后更改一下网段地址:
复制代码
# 下载客户端资源文件(在主节点执行)
curl -LO https://raw.githubusercontent.com/projectcalico/calico/v3.27.2/manifests/custom-resources.yaml
# 修改 pod 的网段地址 cat custom-resources.yaml
sed -i 's/cidr: 192.168.0.0/cidr: 10.244.0.0/g' custom-resources.yaml
然后可以看修改成功:
最后根据这个文件创建资源,执行下面这行命令:
复制代码
kubectl create -f custom-resources.yaml
# 创建成功然后获取一下
watch kubectl get all -o wide -n calico-system
watch kubectl get pods -n calico-system  # 官网

# 官网复制
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.2/manifests/custom-resources.yaml
可以看到创建成功:

部署应用

将会部署一个 nginx 应用,并以 NodePort 形式暴露此 nginx.创建一个 nginx-deploy.yaml 文件。文件内容如下:
复制代码
vim nginx-deploy.yaml (在主节点执行)
kubectl apply -f nginx-deploy.yaml
# 创建如下
deployment.apps/nginx-deploy created
service/nginx-syc created
# 获取
kubectl get all -o wide
# 直接访问
curl 10.100.140.66
# 获取节点
kubectl get node -o wide

下面是 nginx-deploy.yaml

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
	app: nginx-deploy
  name: nginx-deploy
spec:
replicas: 1
selector:
  matchLabels:
    app: nginx-deploy
    
  spec:
    replicas: 1
    selector:
      matchLabels:
        app: nginx-deploy
    template:
      metadata:
        labels:
          app: nginx-deploy
          
      spec:
        containers:
        - image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/nginx:1.25.4
          name: nginx
          ports:
          - containerPort: 80
          
-----

apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-deploy
  name: nginx-svc
  
spec:
  ports: 
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30080
  selector:
    app: nginx-deploy
  type: NodePort
然后执行下面命令部署这个应用程序:
复制代码
kubectl apply -f nginx-deploy.yaml

执行结果如图:

相关推荐
cui__OaO1 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
小狗爱吃黄桃罐头1 小时前
正点原子【第四期】Linux之驱动开发篇学习笔记-1.1 Linux驱动开发与裸机开发的区别
linux·驱动开发·学习
小晶晶京京1 小时前
day34-LNMP详解
linux·运维·服务器
画个太阳作晴天1 小时前
A12预装app
linux·服务器·前端
fengyehongWorld2 小时前
Linux crontab定时任务
linux·运维
shuangrenlong2 小时前
ubuntu更新chrome版本
linux·chrome·ubuntu
碎像3 小时前
Linux上配置环境变量
linux·运维·服务器
40kuai3 小时前
kubernetes中数据存储etcd
容器·kubernetes·etcd
敲上瘾3 小时前
Linux系统cgroups资源精细化控制基础
linux·测试工具·docker·压力测试·cgroups
起个昵称吧4 小时前
线程相关编程、线程间通信、互斥锁
linux·算法