K8S集群搭建

发布时间 2023-10-23 11:31:58作者: 蕝戀

集群搭建的几种方式

  • kubeadm
    • 通过kubeadm init、kubeadm join快速部署集群。
  • 二进制包
    • 下载官方编译好的二进制文件,手动部署,比较麻烦。。
  • 第三方工具、web端
    • 第三方提供的部署工具、web部署端。

kubeadm部署k8s集群

实验环境

master节点:

IP:10.0.1.140

worker节点1:

IP:10.0.1.141

worker节点2:

IP:10.0.1.142

安装步骤

概览

  1. 安装部署docker
  2. 使用kubeadm init创建master节点
  3. 使用kubeadm join将worker节点加入到master。
  4. 部署容器网络(CNI,如:flannel、calico)
  5. 部署web管理端(kube dashboard)

安装docker

参考:Docker的安装、镜像加速配置

安装前配置

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
setenforce 0  # 临时

# 关闭swap
swapoff -a  # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久

# 根据规划设置主机名
hostnamectl set-hostname <hostname>

# 在各个节点添加hosts记录
cat >> /etc/hosts << EOF
10.0.1.140 k8s-master
10.0.1.141 k8s-node1
10.0.1.142 k8s-node2
EOF

# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system  # 生效

# 时间同步
yum install ntpdate -y
ntpdate ntp1.aliyun.com

安装K8S(所有节点都要操作)

# 添加k8s软件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 安装k8s 1.23版本
yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
yum install -y kubelet-1.24.1 kubeadm-1.24.1 kubectl-1.24.1
# 设置kublet开机启动,现不需要start kubelet
systemctl enable kubelet

创建master节点

kubeadm init \
  --apiserver-advertise-address=10.0.1.140 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.23.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --ignore-preflight-errors=all
  
kubeadm init \
  --apiserver-advertise-address=192.168.2.6 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.24.1 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --ignore-preflight-errors=all \
  --cri-socket=unix:///var/run/containerd/containerd.sock
  
•--apiserver-advertise-address 集群通告地址(也就是master节点的IP地址)
•--image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
•--kubernetes-version K8s版本,与上面安装的一致
•--service-cidr 集群内部虚拟网络,Pod统一访问入口
•--pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致

初始化完成后,最后会输出一个join命令,先记住,下面用。

kubeadm join 10.0.1.140:6443 --token pre4w5.zfg39sf9u40q0ljj --discovery-token-ca-cert-hash sha256:ac3fb8317af17eea3587598002f87cd69f59d702a6f6a89aaca13207206bf16d

kubeadm join 192.168.2.6:6443 --token fjeeyj.ko5lirl38zzd51qj \
        --discovery-token-ca-cert-hash sha256:87b5968fe9f578f88f7536345512033278c4230b92ed620466a3a8d05ceb351 \
         --ignore-preflight-errors=all
        
默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:
kubeadm token create --print-join-command


# 根据提示复制配置文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

将worker节点加入master节点

在所有的工作节点输入刚刚master节点生成的加入命令,如:

kubeadm join 10.0.1.140:6443 --token pre4w5.zfg39sf9u40q0ljj --discovery-token-ca-cert-hash sha256:ac3fb8317af17eea3587598002f87cd69f59d702a6f6a89aaca13207206bf16d

如果提示错误(特别是多次执行kubeadm join),可以使用尝试下面方法解决:

# 方法一,重置kubeadm
kubeadm reset

# 方法二:
在命令后添加 --ignore-preflight-errors=all  # 错误将显示为警告的检查列表;例如:'IsPrivilegedUser,Swap'。取值为 'all' 时将忽略检查中的所有错误。

# 方法三
执行的时候接版本 比如--v=5 或者--v=更高的版本


部署容器网络(CNI,calico)

master操作即可。

下载yaml文件

wget https://docs.projectcalico.org/manifests/calico.yaml

编辑yaml文件,开启CALICO_IPV4POOL_CIDR属性,并将值设定为刚刚master节点init中的--pod-network-cidr值:创建master节点

4550             # no effect. This should fall within `--cluster-cidr`.
4551             - name: CALICO_IPV4POOL_CIDR
4552               value: "10.244.0.0/16"
4553             # Disable file logging so `kubectl logs` works.

开始部署calico:

kubectl apply -f calico.yaml
kubectl get pods -n kube-system

部署web管理端(k8s dashboard)

Dashboard是官方提供的一个UI,可用于基本管理K8s资源。

下载yaml:

https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部

vi recommended.yaml
...
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort
...

部署dashboard:

kubectl apply -f recommended.yaml
kubectl get pods -n kubernetes-dashboard

访问dashboard:

访问地址:https://NodeIP:30001

# 记住是工作节点的IP
如:https://10.0.1.140:30001


创建service account并绑定默认cluster-admin管理员集群角色:

# 创建用户
kubectl create serviceaccount dashboard-admin -n kube-system
# 用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# 获取用户Token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

# 将上一步token写入到kubeconfig文件中,这样可以导出kubeconfig,用kubeconf登录dashboard,否则每次都要用token登录。
kubectl config set-credentials kubernetes-admin --token=上一步的token