kubeadm搭建k8s单节点集群——适合中小企业的业务集群

news2024/12/23 18:49:39

实验条件:

master

20.0.0.17

2核4G

docker、kubelet、kubeadm、kubectl、fannel

node1

20.0.0.37

2核4G

docker、kubelet、kubeadm、kubectl、fannel

node2

20.0.0.47

2核4G

docker、kubelet、kubeadm、kubectl、fannel

slave:harbor

仓库节点

20.0.0.27

2核4G

docker、docker-compose、harbor

实验步骤:

一、部署ETCD

【master、node1、node2】

1、清空所有策略、关闭swap交换分区

iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

swapoff -a

sed -ri 's/.*swap.*/#&/' /etc/fstab

加载 ip_vs 模块

for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done

2、主机映射

vim /etc/hosts

3、优化内核参数

cat > /etc/sysctl.d/kubernetes.conf << EOF

#开启网桥模式,可将网桥的流量传递给iptables链

net.bridge.bridge-nf-call-ip6tables=1

net.bridge.bridge-nf-call-iptables=1

#关闭ipv6协议

net.ipv6.conf.all.disable_ipv6=1

net.ipv4.ip_forward=1

EOF

生效参数

sysctl --system

4、所有节点安装docker

yum install -y yum-utils device-mapper-persistent-data lvm2

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install -y docker-ce docker-ce-cli containerd.io

mkdir /etc/docker

cat > /etc/docker/daemon.json <<EOF

{

  "registry-mirrors": ["https://pkm63jfy.mirror.aliyuncs.com"],

  "exec-opts": ["native.cgroupdriver=systemd"],

  "log-driver": "json-file",

  "log-opts": {

    "max-size": "100m"

  }

}

EOF

systemctl daemon-reload

systemctl restart docker.service

systemctl enable docker.service

docker info | grep "Cgroup Driver"

默认使用systemd的资源控制方式(kubeadm一定要使用这种方式)

5、安装kubeadm,kubelet和kubectl  

【master、node1、node2】

(1)定义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

yum install -y kubelet-1.20.15 kubeadm-1.20.15 kubectl-1.20.15

(2)开机自启kubelet

systemctl enable kubelet.service

#K8S通过kubeadm安装出来以后都是以Pod方式存在,即底层是以容器方式运行,所以kubelet必须设置开机自启

(3)查看初始化需要的镜像

kubeadm config images list --kubernetes-version 1.20.15

6、启动kubectl

(1)初始化kubeadm

【master】

kubeadm init \

--apiserver-advertise-address=20.0.0.17 \

--image-repository registry.aliyuncs.com/google_containers \

--kubernetes-version=v1.20.15 \

--service-cidr=10.96.0.0/16 \

--pod-network-cidr=10.244.0.0/16 \

--token-ttl=0

kubeadm join 20.0.0.17:6443 --token sm6f5z.bb99hb9o7mwvwh50 \

    --discovery-token-ca-cert-hash sha256:e39495dcf6033ecb8ada1d97549a6bb460070ef6962883fe03b58f26ffe397eb

--apiserver-advertise-address=192.168.233.91

声明master节点的apiserver的监听地址

--image-repository registry.aliyuncs.com/google_containers

声明拉取镜像的仓库

--kubernetes-version=v1.20.15

k8s集群的版本

--service-cidr=10.96.0.0/16

所有service对外代理地址都是10.96.0.0/16网段

--pod-network-cidr=10.244.0.0/16

所有pod节点的IP地址网段

--token-ttl=0

默认token的有效期是0(0表示永不过期,不设置默认是24小时)

(2)在node节点加入集群

(3)设定kubectl

kubectl需经由API server认证及授权后方能执行相应的管理操作,

kubeadm 部署的集群为其生成了一个具有管理员权限的认证配置文件 /etc/kubernetes/admin.conf,

它可由 kubectl 通过默认的 “$HOME/.kube/config” 的路径进行加载。

mkdir -p $HOME/.kube

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

chown $(id -u):$(id -g) $HOME/.kube/config

systemctl restart kubelet

初始化后需要修改 kube-proxy 的 configmap,开启 ipvs

kubectl edit cm kube-proxy -n=kube-system

修改mode: ipvs

kubectl get cs

发现集群不健康,更改以下两个文件,修改监听地址

vim /etc/kubernetes/manifests/kube-scheduler.yaml

vim /etc/kubernetes/manifests/kube-controller-manager.yaml

# 修改如下内容

把--bind-address=127.0.0.1变成--bind-address=192.168.233.91 #修改成k8s的控制节点master01的ip

把httpGet:字段下的hosts由127.0.0.1变成192.168.233.91(有两处)

#- --port=0 # 搜索port=0,把这一行注释掉

systemctl restart kubelet

此时etcd是单节点,要么部署一台,要么部署三台

二、部署网络(flannel)

1、所有节点上传 flannel 镜像 flannel.tar 和网络插件 cni-plugins-linux-amd64-v0.8.6.tgz 到 /opt 目录,

master节点上传 kube-flannel.yml 文件

cd /opt

docker load < flannel.tar

mv /opt/cni /opt/cni_bak

mkdir -p /opt/cni/bin

tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin

【master】

kubectl apply -f kube-flannel.yml

【node1】

【node2】

注:删除node节点

kubectl delete node 节点名称

三、部署证书有效期

证书有效期的问题,kubeadm默认只有1年

1、查看证书有效期

openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -text | grep Not

openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep Not

2、修改证书有效期

./update-kubeadm-cert.sh all

执行脚本即可

3、在master节点查看节点状态

kubectl get nodes

kubectl get pods -n kube-system

4、添加自动补齐

vim /etc/profile

source <(kubectl completion bash)

source /etc/profile

k8s搭建完成(此时master既是主,又是node节点)

5、测试

(1)创建pod 资源

kubectl create deployment nginx --image=nginx

kubectl get pods -o wide

(2)暴露端口提供服务

kubectl expose deployment nginx --port=80 --type=NodePort

kubectl get svc

(3)测试访问

curl http://20.0.0.37:31298

(4)缩容副本

kubectl scale deployment nginx --replicas=3

kubectl get pods -o wide

四、部署harbor仓库

1、上传 harbor-offline-installer-v2.8.1.tgz 和 docker-compose 文件到 /opt 目录

cd /opt

mv docker-compose-linux-x86_64 docker-compose

cp docker-compose /usr/local/bin/

chmod +x /usr/local/bin/docker-compose

tar zxvf harbor-offline-installer-v2.8.1.tgz

cd harbor/

cp harbor.yml.tmpl harbor.yml

vim harbor.yml

hostname = hub.test.com

   https:

     # https port for harbor, default is 443

  port: 443

     # The path of cert and key files for nginx

     certificate: /data/cert/server.crt

     private_key: /data/cert/server.key

harbor_admin_password = 123456

2、生成证书

mkdir -p /data/cert

cd /data/cert

(1)生成私钥

openssl genrsa -des3 -out server.key 2048

输入两遍密码:123456

(2)生成证书签名请求文件

openssl req -new -key server.key -out server.csr

输入私钥密码:123456

输入国家名:CN

输入省名:BJ

输入市名:BJ

输入组织名:TEST

输入机构名:TEST

输入域名:hub.kgc.com

输入管理员邮箱:admin@test.com

其它全部直接回车

(3)备份私钥

cp server.key server.key.org

(4)清除私钥密码

openssl rsa -in server.key.org -out server.key

输入私钥密码:123456

(5)签名证书

openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crt

chmod +x /data/cert/*

cd /opt/harbor/

./prepare

./install.sh

(6)浏览器访问:https://20.0.0.27(harbor镜像仓库地址)

添加例外 -> 确认安全例外

用户名:admin

密码:123456

harbor仓库搭建完成

五、node节点https免密登录harbor仓库上传镜像

(1)node1登录仓库上传镜像

【node1】

mkdir -p /etc/docker/certs.d/hub.test.com/

【harbor仓库】

在harbor节点把密钥验证目录整个转给node节点:

scp -r data/ root@20.0.0.37:/

【node1】

把刚才的生成的密钥文件放入:

cd /data/cert/

ls

cp server.crt server.csr server.key /etc/docker/certs.d/hub.test.com/

cd /etc/docker/certs.d/hub.test.com/

vim /etc/hosts

20.0.0.27 hub.test.com

vim /lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry=hub.test.com

systemctl daemon-reload

systemctl restart docker

docker login -u admin -p 123456 https://hub.test.com

docker tag nginx:latest hub.test.com/library/nginx:new

docker push hub.test.com/library/nginx:new

(2)node2登录仓库上传镜像

【node2】

mkdir -p /etc/docker/certs.d/hub.test.com/

【harbor仓库】

在harbor节点把密钥验证目录整个转给node节点:

scp -r data/ root@20.0.0.47:/

【node2】

把刚才的生成的密钥文件放入:

cd /data/cert/

ls

cp server.crt server.csr server.key /etc/docker/certs.d/hub.test.com/

cd /etc/docker/certs.d/hub.test.com/

vim /etc/hosts

20.0.0.27 hub.test.com

vim /lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry=hub.test.com

systemctl daemon-reload

systemctl restart docker

docker login -u admin -p 123456 https://hub.test.com

docker tag nginx:latest hub.test.com/library/nginx:newnew

docker push hub.test.com/library/nginx:newnew

(3)测试。从harbor仓库拉取镜像

①创建pod

kubectl create deployment nginxnginx --image=hub.test.com/library/nginx:new --replicas=3

②查看pod

kubectl get pods

结论:从仓库中拉取镜像成功

六、部署dashboard可视化界面

1、上传recommended.yaml脚本到master节点

运行脚本 kubectl apply -f recommended.yaml

2、创建用户

kubectl create serviceaccount dashboard-admin -n kube-system

3、绑定用户

kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

4、获取token值

kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

kubectl get pods -n kubernetes-dashboard

浏览器访问https://20.0.0.37:30001/

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

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

相关文章

mysql基础-表操作

环境&#xff1a; 管理工具&#xff1a;Navicat 数据库版本&#xff1a;5.7.37 mysql的版本&#xff0c;我们可以通过函数&#xff0c;version()进行查看&#xff0c;本次使用的版本如下&#xff1a; 目录 1.管理工具 1.1创建表 1.2.修改表名 1.3.复制表 1.4.删除表 2…

计算机毕业论文内容参考|基于Apriori算法的门诊药物推荐系统的设计与实现

文章目录 摘要:前言相关技术与方法介绍系统分析系统设计系统实现系统测试与优化总结与展望摘要: 本文详细介绍了一种基于Apriori算法的门诊药物推荐系统的设计与实现。该系统利用Apriori算法挖掘患者就诊记录中的药物关联规则,为医生提供药物推荐,从而优化治疗方案。文章首…

mysql基础-字段类型及几点讨论事项

目录 1.主要字段类型 1.1整数 1.2.浮点数类型 1.3.文本类型 1.4.日期与时间类型 2.讨论几点有关字段类型的事 2.1 时间类型字段用字符还是datetime&#xff1f; 2.2 时间类型字段如何设置随时间更新&#xff1f; 2.3 字段长度够用即可 2.4 小数的字段类型选择&#xf…

月薪过万,突破“创业失败+外卖小哥”标签,他这样从什么都不懂晋升为测试团队骨干~

何人年少不轻狂,一身疲惫一人扛。 只有走出学校的大门独自在社会上闯荡一番后才能够切身体会这句话的含义。 哪个少年没有志比天高的崇高的理想&#xff0c;然而现实却是命比纸薄的真实写照。任何一个未正式踏入社会的青年面对未来都是充满激情的&#xff01;真正走向社会才发…

十大排序的个人总结之——冒泡排序、插入排序

同样&#xff0c;这两几乎也是被淘汰了的算法&#xff0c;尽管它们是稳定的&#xff0c;但是时间复杂度没人喜欢&#xff0c;了解一下就好&#xff0c;没啥好说的&#xff0c;注意最后一句话就行了 一&#xff0c;冒泡排序 1. 算法步骤 共n-1趟&#xff0c;谁两敢冒泡就换了…

vue保姆级教程----深入了解 Vue Router的工作原理

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

2024年最新版 Ubuntu 20+ 上安装 Docker

2024年最新版 Ubuntu 20 上安装 Docker 一、前言 在网上搜了一些安装docker的方法&#xff0c;怎么说感觉良莠不齐&#xff0c;参考GPT整理一下来自GPT4这边的安装docker的解决方法&#xff0c;实测能用》2024.1.2&#xff0c;大概耗时7分钟左右&#xff08;在没报错的情况下…

深度学习|2.4 梯度下降

如上图&#xff0c; J ( w , b ) J(w,b) J(w,b)是由w和b两个参数共同控制的损失函数&#xff0c;损失是不好的东西&#xff0c;所以应该求取合适的w和b使得损失最小化。 为了简单考虑&#xff0c;可以先忽略参数b。 斜率可以理解成在朝着x正方向移动单位距离所形成的损失值的变…

Springer build pdf乱码

在textstudio中编辑时没有错误&#xff0c;在editor manager生成pdf时报错。 首先不要改源文件&#xff0c;着重看你的上传顺序&#xff1a; 将.tex文件&#xff0c;.bst文件&#xff0c;.cls文件&#xff0c;.bib文件, .bbl文件的类型&#xff0c;在editor manager中是Item。…

大数据机器学习GAN:生成对抗网络GAN全维度介绍与实战

文章目录 大数据机器学习GAN&#xff1a;生成对抗网络GAN全维度介绍与实战一、引言1.1 生成对抗网络简介1.2 应用领域概览1.3 GAN的重要性 二、理论基础2.1 生成对抗网络的工作原理2.1.1 生成器生成过程 2.1.2 判别器判别过程 2.1.3 训练过程训练代码示例 2.1.4 平衡与收敛 2.2…

Python爬虫---selenium基本使用

为什么使用selenium&#xff1f; 使用urllib.request.urlopen()模拟浏览器有时候获取不到数据,所以使用selenium (1) selenium是一个用于web应用程序测试的工具 (2) selenium 测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样 (3) 支持通过各种driver (FirfoxDri…

工单系统搭建方案 低代码平台快速开发客服工单系统

随着企业数字化转型的加速&#xff0c;工单系统已成为企业运营管理的重要工具之一。通过工单系统&#xff0c;企业可以高效地管理任务、工作流程和业务流程。而低代码平台作为快速应用开发的方式&#xff0c;为企业搭建工单系统提供了更加便捷和灵活的解决方案。本文将介绍如何…

2012年第一届数学建模国际赛小美赛B题大规模灭绝尚未到来解题全过程文档及程序

2012年第一届数学建模国际赛小美赛 B题 大规模灭绝尚未到来 原题再现&#xff1a; 亚马逊是地球上现存最大的雨林&#xff0c;比地球上任何地方都有更多的野生动物。它位于南美洲大陆的北侧&#xff0c;共有9个国家&#xff1a;巴西、玻利维亚、厄瓜多尔、秘鲁、哥伦比亚、委…

让电脑变得更聪明——用python实现五子棋游戏

作为经典的棋类游戏&#xff0c;五子棋深受大众喜爱&#xff0c;但如果仅实现人与人的博弈&#xff0c;那程序很简单&#xff0c;如果要实现人机对战&#xff0c;教会计算机如何战胜人类&#xff0c;那就不是十分容易的事了。本文我们先从简单入手&#xff0c;完成五子棋游戏的…

C# OpenCvSharp读取rtsp流录制mp4可分段保存

软件界面&#xff1a; 测试环境&#xff1a; VS2019 .NET Framework 4.7.2 OpencvSharp4.8.0 输入RTSP流地址即可拉取RTSP流&#xff0c;支持抓拍和录制RTSP流视频&#xff0c;且支持支持按固定时间保存&#xff0c;比如我想5分钟保存一个视频&#xff0c;设置保存间隔为30…

英飞凌TC3xx之一起认识GTM系列(一)先来认识GTM架构

英飞凌TC3xx之一起认识GTM系列(一)先来认识GTM架构 1 先来认识GTM的通用架构2 概览2.1 架构的简要说明2.2 架构概述1 先来认识GTM的通用架构 GTM系统使用GTM全局时钟fGTM 运行(本文称为SYS_CLK)。 特点如下: GTM模块由两个主要部分组成: 由博世设计的GTM IP v3.1.5.1 …

leaflet学习笔记-leaflet-ajax获取数据(五)

前言 地图开发中都会用一些GeoJSON数据进行渲染&#xff0c;这是用就会需要加载GeoJSON数据&#xff0c;这时就可以使用leaflet-ajax进行数据的获取 数据准备 本文通过阿里云的地图选择器&#xff08;DataV.GeoAtlas官网&#xff09;可以找到云南省的GeoJSON数据&#xff0c…

Vue3 watch 的使用,如何监听一个对象中的属性值的变化 vue3 + ts + vite

Vue3 watch 的使用&#xff0c;如何监听一个对象中的属性值的变化 由 vue2 转到 vue3 ts vite 之后都不会写这些玩意了。搜了下&#xff0c;找到了答案&#xff1a; vue2 的 watch export default {watch: {$route.query.id(newValue){// 可以这样监听路由的变化},formUse…

漏洞分析|jeecg-boot 未授权SQL注入漏洞(CVE-2023-1454)

1.漏洞描述 JeecgBoot的代码生成器是一种可以帮助开发者快速构建企业级应用的工具&#xff0c;它可以通过一键生成前后端代码&#xff0c;无需写任何代码&#xff0c;让开发者更多关注业务逻辑。 jeecg-boot 3.5.0版本存在SQL注入漏洞&#xff0c;该漏洞源于文件 jmreport/qu…

华为鸿蒙运行Hello World

前言&#xff1a; 从11月中旬开始通过B站帝心接触鸿蒙&#xff0c;至今一个半月左右不到&#xff0c;从小白到入坑&#xff0c;再到看官网案例&#xff0c;分析案例&#xff0c;了解技术点&#xff0c;还需要理清思路&#xff0c;再写博客&#xff0c;在决定写 &#xff1c;Har…