likes
comments
collection
share

kubernetes系列:✈️k8s集群搭建(收藏篇)

作者站长头像
站长
· 阅读数 16

1.前置环境

⭐注:该章节所有命令在所有机器操作

1.1 三台互通的机器

1.2 linux版本检查

  • 此方式下安装kubernetes集群要求Centos版本要在7.5或之上:cat /etc/redhat-release

1.3 主机名检查

  • 如果是vagrant启动的,那其实在vagrantFile中已经配置过了,在这里无需重复配置
    • 查看主机名:hostnamectl
    • 修改主机名: hostnamectl set-hostname <hostname>

1.4. 同步机器时间

  • kubernetes要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间。企业中建议配置内部的时间同步服务器

  • 安装时间同步插件:yum install -y ntpdate

  • 查看时间:timedatectl

  • 修改时间为上海:timedatectl set-timezone Asia/Shanghai

  • 修改同步服务器地址为阿里云:sed -i.bak '3,6d' /etc/chrony.conf && sed -i '3cserver ntp1.aliyun.com iburst' /etc/chrony.conf

  • 启动chronyd及加入开机自启:systemctl start chronyd && systemctl enable chronyd

  • 查看同步结果:chronyc sources

  • 为了检查chrony是否同步:chronyc tracking

1.5 禁用iptables和firewalld服务

  • kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
  • 关闭firewalld服务
    • systemctl stop firewalld
    • systemctl disable firewalld
  • 关闭iptables服务(在CentOS7以上,防火墙的管理由firewalld来管理)
    • systemctl stop iptables
    • systemctl disable iptables

1.6 禁用selinux

  • selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
  • 禁用selinux
    • 临时有效:sudo setenforce 0
    • 永久有效(选这个):编辑/etc/selinux/config 文件,修改SELINUX的值为disabled要重启): vi /etc/selinux/config

kubernetes系列:✈️k8s集群搭建(收藏篇)

1.7 禁用swap分区

  • swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用
  • 启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备
  • 但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
  • 禁用
    • 临时有效:swapoff -a
    • 永久有效(选这个):
      • echo "vm.swappiness=0" >> /etc/sysctl.conf
      • sysctl -p /etc/sysctl.conf
      • 修改分区配置文件,注释掉swap分区一行(要重启):vi /etc/fstab kubernetes系列:✈️k8s集群搭建(收藏篇)

1.8 配置linux的内核参数

  • 添加网桥过滤和地址转发功能,编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:

sudo vi /etc/sysctl.d/kubernetes.conf

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
  • 重新加载配置,加载网桥过滤模块: modprobe br_netfilter && sysctl -p /etc/sysctl.d/kubernetes.conf
  • 查看网桥过滤模块是否加载成功 : lsmod | grep br_netfilter

1.9 配置ipvs功能

  • 在kubernetes中service有两种代理模型:
  • 是基于ipvs(选这个):
    • ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
    • 1.安装ipset和ipvsadm : yum install ipset ipvsadmin -y
    • 2 添加需要加载的模块写入脚本文件:
    cat > /etc/sysconfig/modules/ipvs.modules <<EOF
    #!/bin/bash
    modprobe -- ip_vs
    modprobe -- ip_vs_rr
    modprobe -- ip_vs_wrr
    modprobe -- ip_vs_sh
    modprobe -- nf_conntrack_ipv4
    EOF
    
    • 3 为脚本文件添加执行权限: chmod +x /etc/sysconfig/modules/ipvs.modules
    • 4 执行脚本文件: /bin/bash /etc/sysconfig/modules/ipvs.modules
    • 5 查看对应的模块是否加载成功: lsmod | grep -e ip_vs -e nf_conntrack_ipv4
  • 基于iptables
    • 也有配置iptables的,将桥接的 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 -p

1.10 安装ipvsadm

yum -y install ipset ipvsadm

1.11 重启服务器

  • 上面步骤完成之后,需要重新启动linux系统: reboot

2. 安装docker

  • 注:该章节所有命令在所有机器操作

  • k8s基于docker容器环境,先安装docker:应用容器引擎Docker(一):Docker安装

  • docker要设置开机启动

  • 由于k8s官方文档中指出使用cgroupfs管理docker和k8s资源,同时使用systemd管理节点上其他进程资源在服务器资源压力大时会出现不稳定,因此推荐修改docker和k8s统一使用systemd: sed -i.bak "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g" /usr/lib/systemd/system/docker.service

  • 重启docker使配置生效

    • systemctl daemon-reload
    • systemctl restart docker
    • systemctl status docker

3. 设置kubernetes仓库,配置阿里云yum源

  • 注:该章节所有命令在所有机器操作
  • 配置阿里云的yum源告诉k8s在哪里加速下载安装
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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

刷新缓存: yum makecache fast

4.安装kubeadm,kubelet,kubectl

  • kubeadm组件可以安装k8s的主节点和使从节点加入集群
  • kubelet组件管理每个node节点,代理并管理pods等
  • kubectl组件是一个命令行工具,可以只安装在master节点即可。

4.1查询版本

yum list|grep kubeyum --showduplicates list kubelet

kubernetes系列:✈️k8s集群搭建(收藏篇)

安装指定版本格式:

yum install -y [package-name]-[version_number]

4.2安装指定版本

  • 注:该章节所有命令在所有机器操作
  1. 安装:yum install -y kubelet-1.22.4 kubeadm-1.22.4 kubectl-1.22.4
  2. 开机启动:systemctl enable kubelet && systemctl start kubelet(此时还是activating状态不用管)
  3. 查看版本:kubelet --version

5. 部署k8s

5.1集群规划

查看hosts配置:cat /etc/hosts

主机名ip角色安装组件
k8s110.0.2.9mastermaster组件,etcd,kubelet,kubectl
k8s210.0.2.8workerworker组件, kubelet
k8s310.0.2.15workerworker组件, kubelet

注:内存每台至少4G

5.2初始化mater节点

5.2.1 先下载初始化kubeadm需要的相关镜像

注:本节命令请在master节点操作

  • 查看master的默认网卡ip: ip route showip addr的eth0网卡ip kubernetes系列:✈️k8s集群搭建(收藏篇)

  • 先下载初始化kubeadm需要的相关镜像,不然执行kubeadm init 命令下载很久,也不知道下载到哪里

  1. 由于官方镜像地址被墙,所以我们需要首先获取所需镜像以及它们的版本。然后从国内镜像站获取。查看指定版本需要镜像版本:kubeadm config images list --kubernetes-version=v1.22.4

  2. 编写下载镜像脚本,版本参考上面命令:

  • mkdir /app/k8s
  • vi /app/k8s/master_images.sh
#!/bin/bash

## 下面的镜像应该去除"k8s.gcr.io/"的前缀,版本换成上面获取到的版本
images=(
	kube-apiserver:v1.22.4
        kube-proxy:v1.22.4
	kube-controller-manager:v1.22.4
	kube-scheduler:v1.22.4
	coredns:v1.8.4
	etcd:3.5.0-0
        pause:3.5
)

for imageName in ${images[@]} ; do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
#下面是默认外国源,下载慢
#   docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName  k8s.gcr.io/$imageName
done
  1. 脚本权限:chmod +x /app/k8s/master_images.sh
  2. 执行下载镜像:./master_images.sh
  3. 查看下载的镜像:docker images

kubernetes系列:✈️k8s集群搭建(收藏篇)

5.2.2 初始化kubeadm

由于上面已经从阿里云仓库下载了所需镜像,下面执行初始化命令就不会去国外下载镜像了。在master节点执行

kubeadm init \
--apiserver-advertise-address=10.0.2.9 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version   v1.22.4 \
--service-cidr=10.96.0.0/16  \
--pod-network-cidr=10.244.0.0/16
  • apiserver-advertise-address:apiserver地址填写要当master机器ip(修改自己的mater的ip
  • image-repository:由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。可以手动按照我们的/app/k8s/master_images.sh先拉取镜像,在配置--image-repository属性就可以用到我们刚才下载好的镜像。地址变为 registry.aliyuncs.com/google_containers 也可以,省去上面5.2.2一步骤(但是初始化命令可能等很久,要下载镜像,所有分开两步骤,确保需要的镜像已经下载)。(不用改)
  • kubernetes-version:指定版本要和安装时一致即可(修改自己的版本
  • service-cidr:设置由pods组成的services通信ip段的子网(不用改)
  • pod-network-cidr:pods的通信ip段的子网(不用改)
  • 科普:无类别域间路由(Classless Inter-Domain Routing、CIDR)是一个用于给用户分配IP地址以及在互联网上有效地路由 IP 数据包的对 IP 地址进行归类的方法。

问题: 出现该问题请关闭集群的虚拟内存交换

[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[ERROR Swap]: running with swap on is not supported. Please disable swap

运行结果: kubernetes系列:✈️k8s集群搭建(收藏篇)

翻译:

要开始使用你的集群,你需要运行以下作为一个普通用户:

 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 apply -f [podnetwork].yaml",其中一个选项列在:
https://kubernetes.io/docs/concepts/cluster-administration/addons/

然后你可以通过在每个worker节点上运行以下命令来加入任意数量的worker节点:

kubeadm join 10.0.2.9:6443 --token gp34b0.p7258upebcqb7zy3 \
        --discovery-token-ca-cert-hash sha256:7435c7011942ad6a754c743218ee5f1cd4ea2842305c3aa3b75666008af567fb 

安装要求执行相关命令即可:

  1. 当前master节点执行:
 mkdir -p $HOME/.kube
 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. pod网络部署到集群,这里选择flannel

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

由于kube-flannel.yml这个文件可能被墙,下载不了,我已放到码云: gitee下载

  • 在master节点上执行安装POD网络插件:kubectl apply -f /app/k8s/kube-flannel.yml
  • 如果想删除该插件可把apply命令改成delete即可

5.3 worker节点加入集群

  • master节点获取名称空间: kubectl get ns
  • master节点查看所有命名空间下所有pods: kubectl get pods --all-namespaces
  • master节点查看集群节点: kubectl get nodes kubernetes系列:✈️k8s集群搭建(收藏篇)
  • 等待master节点状态为Ready,flannel状态为Running。再在每个worder节点执行join命令加入集群(该命令有时间限制,过期会失效)

worker节点执行:

kubeadm join 10.0.2.9:6443 --token gp34b0.p7258upebcqb7zy3 \ --discovery-token-ca-cert-hash sha256:7435c7011942ad6a754c743218ee5f1cd4ea2842305c3aa3b75666008af567fb

kubernetes系列:✈️k8s集群搭建(收藏篇)

  • 再次检查是否已经加入到集群节点: kubectl get nodes
  • 如果worker节点状态为NotReady,监控 pod 进度等3-10分钟: watch kubectl get pod -n kube-system -o wide。等待pod变为Running状态
  • 如果网络出现问题,关闭 cni0,重启虚拟机继续测试:ip link set cni0 down
  • 如果出现下面内容,k8s搭建完成 kubernetes系列:✈️k8s集群搭建(收藏篇)

5.3.1 join命令令牌过期

  • master节点打印一个临时token:kubeadm token create --print-join-command
  • master节点打印一个不过期token:kubeadm token create --ttl 0 --print-join-command

5,4部署Tomcat检验

注:在master上执行命令

  1. 部署一个tomcat
  • kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8
  1. 暴露nginx访问
  • kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort

    • --type=NodePort :为service随机分配端口映射到pod的80,pod的80再映射到容器tomcat的8080
  1. 查看全部信息
  • kubectl get all -o wide

kubernetes系列:✈️k8s集群搭建(收藏篇)

  1. 访问
  • 仅主机网络ip(192.168.56.101/103)+端口(32285):192.168.56.101:32285
  1. 验证成功可删除tomcat部署和服务
  • kubectl delete deployment.apps/tomcat6
  • kubectl delete service/tomcat6

6. 一键安装kubernetes+kubeshere

6.1 KubeKey 环境安装

  • 只需要1.前置环境2.安装docker两个步骤,再执行下面的操作,KubeKey会帮我们一键安装kubernetes和kubesphere。
  1. 环境安装

yum install -y ebtables socat ipset conntrack

  1. 先执行以下命令以确保您从正确的区域下载 KubeKey。

export KKZONE=cn

  1. 执行以下命令下载 KubeKey:

curl -sfL https://get-kk.kubesphere.io | VERSION=v1.2.0 sh -

  1. 查看kubeshere支持的版本

./kk version --show-supported-k8s

6.2kubeshere 安装

这里要指定版本安装,就算安装最新版也要把版本号写上,不然会有问题。下面命令运行生成yaml文件

./kk create config --with-kubernetes v1.18.6 --with-kubesphere v3.0.0

修改为自己的配置值: kubernetes系列:✈️k8s集群搭建(收藏篇)

开始安装:

./kk create cluster -f config-sample.yaml

如果下载不了helm,一直卡在那里,查看/app/k8s/kubekey/v1.21.5/amd64/路径下下载的文件大小,文件大小没有变就是卡在那里了,这时拔网线,会弹出错误,在根据这个错误用迅雷去下载

错误如下:

Failed to download kube binaries: Failed to download helm binary: curl -L -o /app/k8s/kubekey/v1.21.5/amd64/helm-v3.6.3-linux-amd64.tar.gz https://get.helm.sh/helm-v3.6.3-linux-amd64.tar.gz && cd /app/k8s/kubekey/v1.21.5/amd64 && tar -zxf helm-v3.6.3-linux-amd64.tar.gz && mv linux-amd64/helm . && rm -rf *linux-amd64*

下载好插件放到提示的路径下,/app/k8s/kubekey/v1.21.5/amd64/,并执行提示的命令:

cd /app/k8s/kubekey/v1.21.5/amd64 && tar -zxf helm-v3.6.3-linux-amd64.tar.gz && mv linux-amd64/helm . && rm -rf *linux-amd64* 这时重新运行安装命令,会跳过helm下载。其他组件下载慢也可用该方法

这是我这次安装下载的一些组件,分享到gitee

安装过程,也可查看日志: kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

6.3 卸载kubernetes+kubeshere

把刚才的部署文件再用delete命令就是卸载了

./kk delete cluster [-f config-sample.yaml]

6.4kubesphere启用可插拔组件

启用可插拔组件 (kubesphere.com.cn)

安装过程:

  1. 以 admin 身份登录控制台,点击左上角的平台管理,选择集群管理
  2. 点击 CRD,在搜索栏中输入 clusterconfiguration,点击结果查看其详细页面。
  3. 自定义资源中,点击 ks-installer 右侧的 !选择编辑 YAML
  4. 在该 YAML 文件中,搜寻到 openpitrix,将 enabled 的 false 改为 true。完成后,点击右下角的更新,保存配置。

查看安装过程: kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

如果没有开启防火墙,kubeshere需要的端口列表,可以单独为需要端口开放配置:Port Requirements (kubesphere.io)

  • 👍🏻:有收获的,点赞鼓励!
  • ❤️:收藏文章,方便回看!
  • 💬:评论交流,互相进步!