从零开始搭建高可用的k8s集群

一、环境准备

使用Hyper-V虚拟机功能搭建三台Centos虚拟机系统,配置好静态IP,分别为k8s-node1(192.168.0.8),k8s-node2(192.168.0.9),k8s-node3(192.168.0.10)。系统安装成功后配置root远程登录功能,以便使用ssh客户端工具链接。

初始化系统设置:

◉配置虚拟机的MAC地址,确保MAC地址和 product_uuid 对于每个节点都是唯一的。可以通过如下命令来查看他们是否唯一:

ip link
 cat /sys/class/dmi/id/product_uuid

◉分配固定IP :在虚拟机中配置静态IP,首先找到需要配置静态IP的网卡配置文件,我的是eth1,因此修改/etc/sysconfig/network-scripts/ifcfg-eth1文件,设置如下箭头指示的内容:

从零开始搭建高可用的k8s集群

◉更新yum源:运行命令” yum update “更新yum源。

◉开启SSH远程登录:运行命令” yum install openssh-server “安装ssh服务端工具,安装完成后运行命令” systemctl enable sshd.service “设置开启自启动, 运行命令” vim /etc/ssh/sshd_config “编辑配置文件,设置如下:

从零开始搭建高可用的k8s集群

◉修改IPV6为IPV4:centos默认使用ipv6的方式,我们需要修改为ipv4模式来实现ssh客户端的远程连接,具体方法是 cd到 /etc/sysconfig/network-scripts目录下,vim 编辑 ifcfg-eth1 文件,如图,设置IPV6INIT=no,ONBOOT=yes。

从零开始搭建高可用的k8s集群

◉设置防火墙规则:设置防火墙规则的目的是为了确保集群中的机器能够相互通信,本次集群直接使用命令” systemctl disable firewalld “关闭防火墙。在正式环境中,防火墙不可能禁用,因此需要开放如下端口:

从零开始搭建高可用的k8s集群

从零开始搭建高可用的k8s集群

开放指定端口的命令格式为:

firewall-cmd --zone=public  --add-port=6443/tcp --permanent

◉同步系统时间:K8s要求集群中的节点时间必须精确一致,所以在每个节点上同步时间:

yum install ntpdate -y
ntpdate time.windows.com

◉设置让iptables 看到桥接的流量,确保 net.bridge.bridge-nf-call-iptables在您的配置中设置为 1,运行如下代码:

cat <k8s.conf
br_netfilter
EOF

cat <k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

◉配置主机域名映射,修改/etc/hosts文件(一般在集群中的每个节点都做该处理),运行如下命令:

cat >> /etc/hosts << EOF
192.168.0.8 k8s-node1
192.168.0.9 k8s-node2
192.168.0.10 k8s-node3
EOF

◉关闭Linux系统的交换分区:为了保证kubelet的正常运行,必须禁用swap交换分区。window平台上称为虚拟内存。在物理内存不够用时,操作系统会从物理内存中把部分暂时不被使用的数据转移到交换分区,从而为当前运行的程序留出足够的物理内存。运行命令” free -m “结果证明已经开启了交换分区,修改/etc/fstab文件,注释掉加载swap分区的这行记录,重启Linux系统即可。

从零开始搭建高可用的k8s集群

二、安装K8S容器运行时

为了实现k8s与容器运行时的解耦,k8sV1.5以后推出了容器运行时接口CRI的概念,只要实现了该接口的任何容器运行时都可以与k8s结合使用完成集群部署,容器运行时负责启动、停止和运行容器。v1.24 之前的 Kubernetes 版本集成了docker engine,使用名为dockershim的容器运行时组件,在V1.24版本后就不在集成,因此,此版本后的集群搭建,需要手动安装容器运行时,常见的容器运行时有containerd、cri-o、docker engine、Mirantis Container Runtime。安装过程如下:

使用containerd作为运行时(官方推荐):

1、安装和配置先决条件,依次运行如下命令:

cat <

2、安装containerd容器及相关组件,依次运行如下命令:

#安装需要的软件包, yum-util 提供yum-config-manager功能
yum install -y yum-utils

#设置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#安装containerd
yum install containerd -y

#复制替换默认config.toml内容
containerd config default > /etc/containerd/config.toml

#重启、开机启动containerd
systemctl start containerd
systemctl daemon-reloadsystemctl enable containerd

3、编辑 /etc/containerd/config.toml,修改 containerd 默认的sandbox_image ,修改sandbox_image的值为如下:

sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7"

◉配置 cgroup 驱动程序(可选):容器运行时和 kubelet 都有一个名为”cgroupDriver”的属性,需要保证它们的属性值一致,否则kubelet进程无法正常运行。容器运行时的cgroupDriver属性根据不同的组件配置方式有所不同,而kubelet的cgroupDriver属性可以通过kubeadm指定,其方式如下(如果没有使用配置文件方式指定,则默认值为systemd):

kubeadm-config.yaml文件的内容
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kubernetesVersion: v1.21.0

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard


apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-certs
  namespace: kubernetes-dashboard
type: Opaque


apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-key-holder
  namespace: kubernetes-dashboard
type: Opaque


kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
rules:
  # Allow Dashboard to get, update and delete Dashboard exclusive secrets.

  - apiGroups: [""]
    resources: ["secrets"]
    resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]
    verbs: ["get", "update", "delete"]
    # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.

  - apiGroups: [""]
    resources: ["configmaps"]
    resourceNames: ["kubernetes-dashboard-settings"]
    verbs: ["get", "update"]
    # Allow Dashboard to get metrics.

  - apiGroups: [""]
    resources: ["services"]
    resourceNames: ["heapster", "dashboard-metrics-scraper"]
    verbs: ["proxy"]
  - apiGroups: [""]
    resources: ["services/proxy"]
    resourceNames: ["heapster", "http:heapster:", "https:heapster:", "dashboard-metrics-scraper", "http:dashboard-metrics-scraper"]
    verbs: ["get"]


apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: kubernetes-dashboard
subjects:
  - kind: ServiceAccount
    name: kubernetes-dashboard
    namespace: kubernetes-dashboard


kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: kubernetes-dashboard
  template:
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
    spec:
      securityContext:
        seccompProfile:
          type: RuntimeDefault
      nodeName: k8s-node3
      containers:
        - name: kubernetes-dashboard
          image: kubernetesui/dashboard:v2.5.0
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8443
              protocol: TCP
          args:
            - --auto-generate-certificates
            - --namespace=kubernetes-dashboard
            # Uncomment the following line to manually specify Kubernetes API server Host
            # If not specified, Dashboard will attempt to auto discover the API server and connect
            # to it. Uncomment only if the default does not work.

            # - --apiserver-host=http://my-address:port
          volumeMounts:
            - name: kubernetes-dashboard-certs
              mountPath: /certs
              # Create on-disk volume to store exec logs
            - mountPath: /tmp
              name: tmp-volume
          livenessProbe:
            httpGet:
              scheme: HTTPS
              path: /
              port: 8443
            initialDelaySeconds: 30
            timeoutSeconds: 30
          securityContext:
            allowPrivilegeEscalation: false
            readOnlyRootFilesystem: true
            runAsUser: 1001
            runAsGroup: 2001
      volumes:
        - name: kubernetes-dashboard-certs
          secret:
            secretName: kubernetes-dashboard-certs
        - name: tmp-volume
          emptyDir: {}
      serviceAccountName: kubernetes-dashboard
      nodeSelector:
        "kubernetes.io/os": linux
      # Comment the following tolerations if Dashboard must not be deployed on master
      #tolerations:
        #- key: node-role.kubernetes.io/master
         # effect: NoSchedule


kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    k8s-app: dashboard-metrics-scraper
  name: dashboard-metrics-scraper
  namespace: kubernetes-dashboard
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: dashboard-metrics-scraper
  template:
    metadata:
      labels:
        k8s-app: dashboard-metrics-scraper
    spec:
      securityContext:
        seccompProfile:
          type: RuntimeDefault
      nodeName: k8s-node3
      containers:
        - name: dashboard-metrics-scraper
          image: kubernetesui/metrics-scraper:v1.0.7
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8000
              protocol: TCP
          livenessProbe:
            httpGet:
              scheme: HTTP
              path: /
              port: 8000
            initialDelaySeconds: 30
            timeoutSeconds: 30
          volumeMounts:
          - mountPath: /tmp
            name: tmp-volume
          securityContext:
            allowPrivilegeEscalation: false
            readOnlyRootFilesystem: true
            runAsUser: 1001
            runAsGroup: 2001
      serviceAccountName: kubernetes-dashboard
      nodeSelector:
        "kubernetes.io/os": linux
      # Comment the following tolerations if Dashboard must not be deployed on master
      #tolerations:
      #  - key: node-role.kubernetes.io/master
      #    effect: NoSchedule
      volumes:
        - name: tmp-volume
          emptyDir: {}

创建过程如图所示:

从零开始搭建高可用的k8s集群

2、查看Dashboard的运行状态,使用命令” kubectl get pod -A “查看得如下结果,此时需要等待状态变为Running。

从零开始搭建高可用的k8s集群

3、修改访问模式:运行命令” kubectl get svc -A |grep kubernetes-dashboard “查看端口,结果如下。

从零开始搭建高可用的k8s集群

ClusterIP为集群内部网络访问方式,需要修改成NodePort,来支持集群主机访问的方式,运行如下命令来修改资源配置:

kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

从零开始搭建高可用的k8s集群

再次运行命令” kubectl get svc -A |grep kubernetes-dashboard “查看端口,结果如下,多了一个映射端口30704,我们就可以通过任意一台集群机器的IP+30704端口就能访问该资源。

从零开始搭建高可用的k8s集群

4、访问https://192.168.0.10:30704,发现无法打开页面,再次运行 ” kubectl get pod -A “却发现Running状态变成了CrashLoopBackOff,如图:

从零开始搭建高可用的k8s集群

运行命令 ” kubectl describe pod kubernetes-dashboard-6cdd697d84-kcz6p -n kubernetes-dashboard “查看POD日志,发现如下警告:

从零开始搭建高可用的k8s集群

原因是kubernetes-dashboard POD被默认安装到了非master节点,产生了权限不足的问题,需要按照前面提到的个性化yaml配置重新部署,步骤如下:

◉删除已经安装的POD:

kubectl delete Deployment kubernetes-dashboard -n kubernetes-dashboard
 kubectl delete Deployment dashboard-metrics-scraper -n kubernetes-dashboard

◉重新通过修改后的recommended.yaml文件创建POD:

kubectl apply -f  recommended.yaml

折腾到这里,kubernetes-dashboard面板已创建完成,访问https://192.168.0.10:30000,显示界面如下:

从零开始搭建高可用的k8s集群

如果开启账号密码登录,则界面如下:

从零开始搭建高可用的k8s集群

从零开始搭建高可用的k8s集群

六、k8s可视化界面Dashboard的登录认证方式详解

待续…….

、使用 Dashboard界面方式部署一套完整的微服务项目

待续…….

八、使用kubectl命令行工具部署一套完整的微服务项目

待续…….

Original: https://www.cnblogs.com/zqhIndex/p/16200734.html
Author: 我若安好,便是晴天
Title: 从零开始搭建高可用的k8s集群

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612566/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • IO模型

    Unix IO模型 对于一个套接字上的输入操作,分为两步: 等待数据准备好(从网络中到达,到内核缓冲区) 将数据从内核缓冲区复制到应用进程缓冲区 I/O模型主要为以下五种: 阻塞I…

    数据库 2023年6月11日
    078
  • C/C++内存泄漏检测方法

    内存泄漏 检测代码 使用链表记录每个malloc返回的指针,释放时从链表中查找并删除找到对应指针的节点。 最终输出链表,该链表记录了所有没有释放的动态内存。 #include #i…

    数据库 2023年6月14日
    082
  • 给小白的 PostgreSQL 容器化部署教程(上)

    作者:王志斌编辑:钟华龙 本文来自社区小伙伴 王志斌 的投稿。从小白的角度,带你一步步实现将 RadonDB PostgreSQL 集群部署到 Kubernetes 上。文章分为上…

    数据库 2023年5月24日
    0111
  • 多商户商城系统功能拆解21讲-平台端分销订单

    多商户商城系统,也称为B2B2C(BBC)平台电商模式多商家商城系统。可以快速帮助企业搭建类似拼多多/京东/天猫/淘宝的综合商城。 多商户商城系统支持商家入驻加盟,同时满足平台自营…

    数据库 2023年6月14日
    0103
  • 类加载器及其加载原理

    概述 在之前的文章”类的加载流程”讲了一个Class文件从加载到卸载整个生命周期的过程,并且提到”非数组类在加载阶段是可控性最强的”…

    数据库 2023年6月11日
    0106
  • Matery主题自定义(一)黑夜模式

    黑夜模式 作为一个前端学习者,自然懂得黑夜模式的重要性,可惜主题原生未提供,那就自己弄吧 参考其他优秀产品的黑夜模式,得出共性: 那就是黑夜模式的背景一般不会是纯黑(#000);而…

    数据库 2023年6月16日
    076
  • null调整为not null default xxx,不得不注意的坑

    最近碰到一个case,值得分享一下。 现象 一个DDL,将列的属性从null调整为not null default xxx, alter table slowtech.t1 mod…

    数据库 2023年6月11日
    0110
  • Eureka详解系列(三)–探索Eureka强大的配置体系

    通过前面的两篇博客,我们知道了:什么是 Eureka?为什么使用 Eureka?如何使用 Eureka?今天,我们开始来研究 Eureka 的源码,先从配置部分的源码开始看,其他部…

    数据库 2023年6月6日
    0205
  • VS code 每次退出都要重新下载解决方案

    VS code 每次退出都要重新下载解决方案 打开文件-首选项-设置 在搜索栏输入Extensions: Auto Update 然后把所有打钩的取消 ,退出vs code 的时候…

    数据库 2023年6月16日
    096
  • OpenStack-iaas之“先点”云平台安装

    1.认识OpenStack 1.云计算的起源 早在2006年3月,亚马逊公司首先提出弹性计算云服务。2006年8月9日,谷歌公司首席执行官埃里克·施密特(Eric Schmidt)…

    数据库 2023年6月14日
    082
  • MySQL语句与正则表达式

    正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定正则表达式,过滤SELECT检索出的数据…

    数据库 2023年6月16日
    096
  • 计算机组成原理——概述篇

    计算机发展历史 电子管计算机(1946 年——1958 年) 第一台计算机为ENIAC 诞生于美国宾夕法尼亚大学 特点: 集成度小,空间占用大 功耗高,运行速度慢 操作复杂,更换程…

    数据库 2023年6月16日
    063
  • CentOS7.2解决vsftpd启动失败,code=exited,status=2问题的几个方法参考

    【问题说明】重启vsftpd服务失败:[root@data ~]# systemctl restart vsftpdJob for vsftpd.service failed. S…

    数据库 2023年6月14日
    0334
  • innoDB对MVCC的实现

    InnoDB存储引擎在 RR 级别下通过 MVCC和 Next-key Lock 来解决幻读问题: 1、执行普通 select,此时会以 MVCC 快照读的方式读取数据 在快照读的…

    数据库 2023年6月16日
    088
  • Dubbo源码(八)-负载均衡

    前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)…

    数据库 2023年6月11日
    079
  • eclipse连接MySQL 8.0.29.0

    推荐文章: eclipse导入JDBC MySQL详细安装 菜鸟java MySQL连接教程 步骤: 找到MySQL的连接Java的jar文件; 如下图: 在eclipse项目文件…

    数据库 2023年5月24日
    0109
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球