Ubuntu部署k8s环境

Ubuntu搭建K8s集群指南

环境如下:

系统:Ubuntu 24.04.3 LTS

使用3台机器搭建一个1个master​节点,2个node​节点的集群

k8s版本为1.34

docker版本为29.0​

角色ip
master192.168.200.201
node1192.168.200.202
node2192.168.200.203

确保每台机器的时间一致,并且主机名不同

1 搭建k8s集群

!!1,2,3,4步需要三台主机一起执行

1.1 关闭swap分区

到/etc/fstab​中注释掉swap的相关挂载

再执行

swapoff -a

1.2 配置br_netfilter 内核模块

sudo modprobe br_netfilter

#写入内核参数配置文件(已包含 flannel 所需的桥接转发参数)
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

1.3 安装cri-docker

安装包地址:https://github.com/Mirantis/cri-dockerd/releases

下载后将其解压复制到/usr/bin​

tar xvf cri-dockerd-0.3.21.amd64.tgz
install -o root -g root -m 0755 ./cri-dockerd/cri-dockerd /usr/bin/cri-dockerd

创建文件模板/etc/systemd/system/cri-docker.service​

sudo tee /etc/systemd/system/cri-docker.service <<-'EOF'
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket

[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target
EOF

创建文件模板/etc/systemd/system/cri-docker.socket​

sudo tee /etc/systemd/system/cri-docker.socket <<-'EOF'
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service

[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target
EOF

启动cri-docker​

systemctl daemon-reload
systemctl enable --now cri-docker.socket

1.4 安装软件包

  • ​kubeadm​:用于初始化集群
  • ​kubelet​:在集群中每个节点上用来启动pod和容器
  • ​kubectl​:与集群通信的命令行工具

使用国内源安装,此处安装的k8s为1.34版本,如想安装其他版本可自行更改命令的版本号

apt-get update && apt-get install -y apt-transport-https
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/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.34/deb/ /" |
    tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl

1.5 master节点配置kubeadm

创建文件kubeadm_init.yaml​(注意更改为自己master节点的IP)

sudo tee ./kubeadm_init.yaml <<-'EOF'
apiVersion: kubeadm.k8s.io/v1beta4
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.200.201 #更改为自己的masterIP
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/cri-dockerd.sock
  imagePullPolicy: IfNotPresent
  taints: null
---
apiVersion: kubeadm.k8s.io/v1beta4
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.34.2  #k8s版本号
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16
scheduler: {}
EOF

1.6 在master上初始化k8s集群

kubeadm init --config ./kubeadm_init.yaml

成功后,按照提示复制config文件到指定目录

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

1.7 在master配置集群网络

此处我们配置Flannel​网络

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

运行命令检查coreDNS pod​是否处于Running​状态

kubectl get pods -A

1.8 将node节点加入集群

在两台node节点执行以下命令

由于存在两个容器(k8s自带的containerd与我们手动安装的cri-dockerd)接口,这里我们需要指定为cri-dockerd接口,注意使用自己master对应的ip​和hash

kubeadm join 192.168.200.201:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:c715712cfb19ba11fc94f2fee123944f3a8d0bdc4e24ee702332fbe4a43bf1ac \
        --cri-socket /var/run/cri-dockerd.sock #此处指定容器接口

执行命令查看pod是否running

kubectl get pods -A -o wide

执行命令查看集群中的所有节点

kubectl get nodes

2 安装k8s组件

搭建完k8s集群之后,我们还需要安装4个组件

  • ​helm​:类似apt那样的包管理工具
  • ​dashboard​:仪表盘,更直观的查看k8s中的资源情况
  • ​nginx ingress​:整个集群的出口,相当于最集群前端的nginx
  • ​meatllb​:让服务的LoadBalancer可以绑定局域网ip

2.1 helm

下载最新软件包

Releases · helm/helm

上传给master节点

tar xvf helm-v4.0.0-linux-amd64.tar.tar
mv linux-amd64/helm /usr/bin/

2.2 dashboard

这里我们用helm安装

# 添加存储库
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
# 安装或者升级dashboard 
helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard

创建服务账户 创建文件模板dashboard-adminuser.yaml​

sudo tee ./dashboard-adminuser.yaml <<-'EOF'
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF

应用到集群

kubectl apply -f dashboard-adminuser.yaml

创建令牌,用于页面登录

kubectl -n kubernetes-dashboard create token admin-user

红框的内容为令牌,复制保存

2.3 ingress

GitHub - kubernetes/ingress-nginx: Ingress NGINX Controller for Kubernetes

下载yaml文件

wget -O nginx_ingress.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.14.0/deploy/static/provider/cloud/deploy.yaml

查看文件可发现使用的镜像为国外镜像仓库,这里我们更改为国内源

先记下文件里的两个版本号

将国内源版本编辑为上面俩版本号

sed -i "s|registry.k8s.io/ingress-nginx/controller:v.*|registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.14.0|" nginx_ingress.yaml
sed -i "s|registry.k8s.io/ingress-nginx/kube-webhook-certgen:v.*|registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.6.4|" nginx_ingress.yaml

应用到集群

kubectl apply -f nginx_ingress.yaml

查看pod​启动状态

kubectl get pod -n ingress-nginx

controller running即为成功,而后admission消失,可通过命令查看是否存在secret

kubectl get secret -n ingress-nginx | grep ingress-nginx-admission

2.4 Meatllb

这里我们用helm安装

# 添加repo源
helm repo add metallb https://metallb.github.io/metallb
# 安装
helm install metallb metallb/metallb

查看pod​启动状态

kubectl get pods

创建配置模板meatllb.yaml​

#使用闲置IP地址池
sudo tee ./meatllb.yaml <<-'EOF'
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
spec:
  addresses:
  - 192.168.200.233-192.168.200.253 
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
EOF

查看所有节点,目前四个组件已运行成功

查看服务

kubectl get svc -A

我们要将kubernetes-dashboard-kong-proxy的网络模式更改成LoadBalancer

kubectl edit svc kubernetes-dashboard-kong-proxy -n kubernetes-dashboard

可以看到向外暴露了一个地址池里的IP,我们访问这个地址的443端口验证一下

把先前保存好的密令粘贴进去(也可以重新生成)

kubectl -n kubernetes-dashboard create token admin-user

成功登陆仪表盘,ingress-nginx也是同理操作

至此k8s基本环境部署完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值