Kubernetes部署+kubesphere管理平台安装

news2024/11/24 6:53:04

Kubernetes官网;kubesphere官网

         不论是Kubernetes官网还是找的其它部署步骤,基本都是推荐搭建集群的方式,是为了实现高可用.....等等,这样一来至少需要两台或三台的服务器来搭建,这样对我们的成本也是非常大的,所以我就尝试了用一台机器来部署,下面是具体的流程; 

一、Kubernetes搭建

 1、环境准备

Centos7操作系统(2核 + 5G内存 + 50G空间)

因为还要安装kubesphere管理工具,所以内存和空间尽量要大一点

2、安装方式

k8s的常用安装方式有两种(本文是通过kubeadm的方式):

方式优势缺点
kubeadm简单、快速无法更好的理解k8s各个组件之间的关系
二进制包安装繁琐、复杂可能更好的理解k8s集群组件的关系

 3、配置机器的host文件

vim /etc/hosts

#添加内容

192.168.1.16 k8s-master

可以使用 ping k8s-master 看是否可以ping通

 4、禁用防火墙

#docker会产生很多端口规则,为了引起不必要的麻烦,自己关闭掉(反正这个环境只是学习使用的,生成环境不要这么做)
systemctl stop firewalld
systemctl disable firewalld
systemctl stop iptables
systemctl disable iptables

 5、禁用linux系统的安全服务selinux

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

6、禁用swap分区

#作用是在物理内存使用完之后虚拟磁盘空间作为内存使用,开启此会产生性能影响,在搭建k8s集群的时候如果开启的话还需要特别说明

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

7、修改linux内核参数

#修改linux内核参数,添加网桥过滤和地址转发功能
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

#  重新加载配置
sysctl -p
#加载网桥过滤模块
modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
lsmod|grep br_netfilter

8、配置ipvs功能

#安装ipset、ipvsadm
yum -y install ipset ipvsadm
#添加需要加载的模块,写入到脚本文件中
vi /etc/sysconfig/modules/ipvs.modules
#内容如下
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

#为脚本文件添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
#执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules
#查询对应模块是否加载成功
lsmod |grep -e ip_vs -e nf_conntrack_ipv4

#最后重启下服务器
reboot

 9、时间同步

#时间最好也做下更新
yum install ntpdate -y
ntpdate time.windows.com

10、安装docker

可参考之前的文章介绍:

docker安装
注意更改下/etc/docker/daemon.json文件:

{
    "log-driver":"json-file",
    "log-opts":{
        "max-size":"500m",
        "max-file":"3"
    },
    "exec-opts":[
        "native.cgroupdriver=systemd"
    ],
    "registry-mirrors":[
        "https://kfwkfulq.mirror.aliyuncs.com",
        "https://2lqq34jg.mirror.aliyuncs.com",
        "https://pee6w651.mirror.aliyuncs.com",
        "https://registry.docker-cn.com",
        "http://hub-mirror.c.163.com",
        "https://39dvdikp.mirror.aliyuncs.com"
    ]
}

11、添加kubernetes软件源

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

12、安装kubeadm,kubelet和kubectl

由于版本更新频繁,这里指定版本号部署:
sudo yum install -y kubelet-1.23.8 kubeadm-1.23.8 kubectl-1.23.8

# 设置开机启动
systemctl enable kubelet

13、kubeadm初始化

kubeadm init \
--apiserver-advertise-address=192.168.1.16 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.8 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all  \
--v=6

 使用 kubectl vesion 可查看安装的kubernetes的版本:

 看到上图所示代表安装成功,然后按顺序执行如下命令:
 

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

14、安装网络组件

在没有安装前看到有一些状态是不正常的,待安装网络组件后会恢复正常:
kubectl apply -f https://docs.projectcalico.org/v3.23/manifests/calico.yaml

 12、简易安装Nginx进行测试

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc 
#在 web 浏览器输入以下地址,会返回 nginx 欢迎界面
http://192.168.1.16:32409 (32409 该端口为kubectl get pod,svc命令获取)

遇到错误:使用kubectl get pod发现状态一直为Pending,这是因为k8s的master节点默认是不能跑pod任务的,所以需要解除限制,这样就不需要部署集群了, 但还是建议条件允许的情况下以集群的方式进行部署

# 将master节点设为可以调度
kubectl taint nodes --all node-role.kubernetes.io/master-
 
# 如果需要设为不允许调度
# kubectl taint nodes master node-role.kubernetes.io/master=:NoSchedule
# 污点可选参数
      NoSchedule: 一定不能被调度
      PreferNoSchedule: 尽量不要调度
      NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod

再次查看发现状态已恢复:

 

二、Kubernetes 可视化管理界面安装

        kubesphere明确说明基于k8s安装需要配置DefaultStorageclass,我这里是搭建基于NFS的DefaultStorageclass


1、安装nfs必要的工具

# 安装必要软件
yum -y install nfs-utils rpcbind
# 设置开机自启动
systemctl enable nfs
systemctl enable rpcbind

# 启动nfs
systemctl start rpcbind
systemctl start nfs

# 配置nfs
vim /etc/exports
/work/k8s/nfsdata 192.168.1.0/24(rw,no_root_squash,no_all_squash,sync)
# 启动nfs
systemctl restart nfs

 2、基于NFS创建Storageclass

这里需要三个文件 class.yaml deployment.yaml rbac.yaml
创建文件夹统一管理 :mkdir /home/k8s/yml/nfs-client
class.yaml文件:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
  name: managed-nfs-storage
provisioner: fuseim.pri/ifs
parameters:
  archiveOnDelete: "false"

 deployment.yaml文件(注意更换文件中的IP和nfs文件目录):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: quay.io/external_storage/nfs-client-provisioner:latest
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs
            - name: NFS_SERVER
              value: 192.168.1.16
            - name: NFS_PATH
              value: /work/k8s/nfsdata
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.1.16
            path: /work/k8s/nfsdata


rbac.yaml文件:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: default
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io

执行部署:

kubectl apply -f class.yaml
kubectl apply -f deployment.yaml
kubectl apply -f rbac.yaml

效果如图:

3、安装 Kubersphere

# 执行以下命令安装
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.2.2/kubesphere-installer.yaml
   
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.2.2/cluster-configuration.yaml
 

# 执行以下命令检查安装日志 过程稍微有点长 最后出现文章开头的内容就说明安装成功
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f


如图代表安装成功;在浏览器中出入日志中提示的访问地址即可


4、Kubersphere平台访问效果图

 

 

 

 此时我们使用docker ps查看docker已经运行了好多容器:


 

        后续将会补充通过Kubersphere平台进行部署 Nginx、Rabbitmq、Mysql等相关服务 以及 部署SpringBoot项目等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/579547.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HCIA-MSTP替代技术之链路捆绑(手工模式)

目录 1&#xff0c;网络的可靠性需求 2&#xff0c;链路聚合原理 链路聚合&#xff1a; 聚合组(Link Aggregation Group&#xff0c;LAG)&#xff1a; 成员接口和成员链路&#xff1a; 活动接口和活动链路&#xff1a; 非活动接口和非活动链路&#xff1a; 聚合模式&…

应急响应-web

应急响应的流程分为6个阶段 PDCERF 准备 &#xff0c;检测&#xff0c;抑制&#xff0c;根除&#xff0c;恢复&#xff0c;总结 准备&#xff1a; 准备阶段就是以预防为主&#xff0c;准备一些应急响应的预案&#xff0c;对应急响应的分工操作制定一些计划&#xff0c;进行应…

Redis的数据结构

一)SDS 在redis中&#xff0c;保存key的是字符串&#xff0c;value往往是字符串或者是字符串的集合&#xff0c;可见字符串是redis中最常用的一种数据结构: 但是在redis中并没有直接使用C语言的字符串&#xff0c;因为C语言的字符串存在很多问题 1)获取字符串的长度需要通过运算…

突破自动化测试瓶颈!WEB自动化测试鼠标与键盘操作最佳实践分享

目录 引言 鼠标操作方法 说明 实例化对象 方法 实例1 实例2 拖拽 注意 键盘操作 说明 Keys类 常用的键盘操作 案例 结语 引言 在现代软件测试中&#xff0c;WEB自动化测试已经成为了必不可少的一部分&#xff0c;然而&#xff0c;面对各种繁琐的测试场景&#xf…

章节2: husky + 自动检测是否有未解决的冲突 + 预检查debugger + 自动检查是否符合commit规范

在章节1中我们学习到了commit的规范、husky的安装和使用、lint-staged怎么安装以及怎么用来格式化代码。那么这篇文章我们来看看commit预处理中我们还能做哪些处理呢&#xff1f; 自然&#xff0c;我们还是要用到husky这个东西的&#xff0c;大致过程其实和章节1异曲同工&#…

sql语句查询数据库字段和表字段数量

》新建数据库:CREATE DATABASE IF NOT EXISTS 数据库名; 示例&#xff1a;:CREATE DATABASE IF NOT EXISTS test_db; 》进入数据库&#xff1a;use 数据库名称&#xff1b; 示例&#xff1a;use test_db; 》数据库中创建表: create table 表名(字段名 字段类型(长度),字段名 字…

零基础自学黑客【网络安全】啃完这些足够了

我刚学网络安全&#xff0c;该怎么学&#xff1f;要学哪些东西&#xff1f;有哪些方向&#xff1f;怎么选&#xff1f; 怎么入门&#xff1f; 这个 Web 安全学习路线&#xff0c;整体大概半年左右&#xff0c;具体视每个人的情况而定。 &#xff08;上传一直很模糊&#xff0c…

网络安全做红队攻防 35 岁以后可以干嘛?

35岁之后不是都当技术总监&#xff0c;CTO了或者自己创业了吗&#xff1f; 不会&#xff0c;单渗透测试来说&#xff0c;到后期更多是经验的积累。同一个事情&#xff0c;经验老道师傅的可能用更少的命令&#xff0c;发更少的请求完成这个事情&#xff0c;更隐蔽&#xff0c;更…

从AI到BI:隐语SCQL深度解读(附视频)

3月29日,“隐语开源社区开放日”活动顺利举办。当天隐语社区正式开源SCQL引擎,在工业界首次实现了隐私数据从Al到BI分析,是隐语走向易用的重要一步!下文为隐语框架负责人王磊在活动现场的分享内容。 我们知道,在隐私计算目前应用较多的场景中,无论是风控场景的LR、XGB,还…

每日学术速递5.27

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Control-A-Video: Controllable Text-to-Video Generation with Diffusion Models 标题&#xff1a;Control-A-Video&#xff1a;使用扩散模型生成可控的文本到视频 作者&#xff…

vcruntime140.dll无法继续执行代码如何修复,使用这个方法不求人

VCRUNTIME140.dll 是由微软公司开发的一个库文件&#xff0c;属于 Visual C Redistributable 软件包的一部分。它包含了许多与 C 应用程序运行时相关的函数和数据类型。这些函数和数据类型包括内存管理、异常处理、文件 I/O 等等。如果您在运行某个程序时发现缺少了 VCRUNTIME1…

PriorityQueue优先级队列

前言 优先级队列就是在堆的基础上进行改造&#xff0c;那么什么是堆&#xff0c;又什么是优先级队列呢&#xff1f; 我们一起来看看吧&#xff01; 目录 前言 一、堆 &#xff08;一&#xff09;堆的创建 &#xff08;二&#xff09;堆的插入 &#xff08;三&#xff09;堆…

win10 nvprof的性能分析表

交叉访问是全局内存中最糟糕的访问模式&#xff0c;因为它浪费总线带宽 使用多个线程块对基于交叉的全局内存访问重新排序到合并访问 https://mp.weixin.qq.com/s/h2XKth1bTujnrxyXTJ2fwg <<<numBlocks, blockSize>>> 的两个参数应该怎么设置好呢。首先&…

lazada商品评论数据接口,支持多站点

可以使用Lazada的开放平台API来获取商品评论数据。以下是使用API获取Lazada商品评论数据的基本步骤&#xff1a; 1.注册Lazada开发者账号&#xff0c;创建API密钥和访问令牌。 2.调用Lazada Open API中的Product Review API&#xff0c;提供商品的SKU或Seller SKU参数&#x…

Spring Authorization Server 系列(二)获取授权码

Spring Authorization Server 系列&#xff08;二&#xff09;获取授权码 概述获取授权码获取授权码的url逻辑解析匹配url参数解析 三级目录 概述 Spring Authorization Server 是基于 OAuth2.1 和 OIDC 1.0 的。 只有 授权码&#xff0c;刷新token&#xff0c;客户端模式。 …

Python GUI:真的只知道PyQt?

B站|公众号&#xff1a;啥都会一点的研究生 有时候我们有需求将程序制作成GUI&#xff08;图形用户界面&#xff09;格式&#xff0c;以方便用户通过图形图标与电子设备进行交互&#xff0c;而大多数像我一样的小白基本上只知道PyQt&#xff0c;往往制作出来的界面一眼就可辨别…

如何编写快速高效的SQL查询(一)——MySQL8.0优化器查询优化处理与样例

当希望MySQL能够以更高的性能运行查询时&#xff0c;最好的办法就是弄清楚MySQL是如何优化和执行查询的。一旦理解了这一点&#xff0c;很多查询优化工作实际上就是遵循一些原则让优化器能够按照预想的合理的方式运行。 MySQL是如何执行一个查询的过程的&#xff1f;根据图8-1可…

SpringCloud高级篇 - 微服务保护

✨作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 学习课程视频 SpringCloud 高级篇 – 微服务保护 1.初识Sentinel 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中&#xff0…

Spring IOC体系结构设计原理详解

Spring是一个开源的JavaEE全栈框架&#xff0c;其中最为重要的核心模块是Spring IOC&#xff08;Inversion of Control&#xff09;容器。它负责对象的生命周期管理及依赖注入&#xff0c;为开发者提供了一种主动参与对象创建过程的方式。本文将从IOC容器的设计原理出发&#x…

新增ES6中的扩展

1. ES6中数组新增了哪些扩展&#xff1f; Rest 参数与 Spread 语法 在 JavaScript 中&#xff0c;很多内建函数都支持传入任意数量的参数。 例如&#xff1a; Math.max(arg1, arg2, ..., argN) —— 返回参数中的最大值。Object.assign(dest, src1, ..., srcN) —— 依次将属…