一、知识点分析

1.什么是k8s、做什么用的?
  kubernetes简称k8s,2014年6月由Google公司正式公布出来并宣布开源,是容器集群管理系统(容器编排工具),是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
2.什么是docker?
  docker是完整的一套容器管理系统,它提供了一组命令,让用户更加方便直接地使用容器技术,而不需要过多关心底层内核技术。
3.什么是calicao?
  Calico 是一套基于路由(BGP)的 SDN,它通过路由转发的方式实现容器的跨主机通信。Calico 将每个节点虚拟为一个“路由器”并为之分配独立的虚拟网段,该路由器为当前节点上的容器提供路由服务。

二、环境及配置文件


(注意:三台节点是可以访问互联网的)

主机名 ip地址 角色 备注
node-3 192.168.200.153 master、harbor 管理节点
node-4 192.168.200.154 node 计算节点
node-5 192.168.200.155 node 计算节点

1.阿坤的calico.yaml【r7q1】
官方配置文件:

wget https://docs.projectcalico.org/v3.22/manifests/calico.yaml --no-check-certificate

2.阿坤的kubeadm-init.yaml【r7q1】
3.docker-compose-linux-x86_64【r7q1】
4.harbor-offline-installer-v2.4.2【r7q1】

三、系统环境配置

本次搭建要求准备虚拟机环境,具体要求如下:

1.准备虚拟机master实验环境
2.最低配置:2cpu,2G内存
3.卸载防火墙 firewalld
4.禁用 selinux 和 swap
5.配置yum仓库,安装kubeadm、kubelet、kubectl、docker-ce
6.配置docker私有镜像仓库和cgroup驱动(daemon.json)
7.配置内核参数(/etc/sysctl.d/k8s.conf)

1.1步骤(其俩节点亦同)
1)host文件配置

[root@node-3 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.200.153  node-3
192.168.200.154  node-4
192.168.200.155  node-5[root@node-3 ~]#

2)修改主机名

 hostnamectl set-hostname node-3

3)关闭firewalld(或卸载)

 systemctl stop firewalld && systemctl disable firewalld

4)重置iptables(清理不干净直接影响k8s、calico、docker集群网络环境)

iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
sysctl net.bridge.bridge-nf-call-iptables=1

5)清理残余网卡(纯新环境请忽略)

#之前搭过集群环境的可能有cni、flannel、calico网卡残余
ip link del cni0
ip link del flannel.1
ip link del tunl0

6)禁用 selinux 和 swap

[root@node-3 ~]# vim /etc/selinux/config
...
SELINUX=disabled
...
:wq
[root@node-3 ~]#  swapoff -a
#注释掉swap挂载
[root@node-3 ~]# vim /etc/fstab
#UUID=67ab21b6-7963-41ad-857e-8d5d9b707d14 swap                    swap    defaults        0 0
:wq

7)配置yum仓库,安装kubeadm、kubelet、kubectl、docker-ce

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum repolist
yum install -y docker-ce docker-ce-cli containerd.io
yum install -y kubeadm kubelet kubectl
yum install -y ipvsadm ipset
yum install -y wget
yum remove  -y NetworkManager
#卸载NetworkManager启用network(默认是启用的)
systemctl restart network
systemctl enable network
#根据calico官方的说法可以不卸载增加配置文件,让calico具有网络管理权
vim /etc/NetworkManager/conf.d/calico.conf
[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:tunl*

8)配置daemon.json(需要手动创建)

#registry镜像仓库我用的harbor
[root@node-3 ~]# vim  /etc/docker/daemon.json
{"registry-mirrors": ["https://3laho3y3.mirror.aliyuncs.com"],"insecure-registries":["192.168.200.153:8080", "registry:8080"],"exec-opts": ["native.cgroupdriver=systemd"]
}
:wq
# 注意:重启docker服务前要停止所有容器
# 有配置改动的话需要daemon加载
[root@node-3 ~]# systemctl daemon-reload
[root@node-3 ~]# systemctl restart docker

9)配置内核参数(/etc/sysctl.d/k8s.conf)

[root@node-3 ~]# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
:wq
#加载内核模块
[root@node-3 ~]#  modprobe br_netfilter
[root@node-3 ~]#  sysctl --system

10)重启(可选)

#设置的selinux需要重启或临时放行,修改主机名后需重新登入
#重启
[root@node-3 ~]# reboot
#不重启,选择放行selinux,我的重启过所以显示disabled,没重启应该是permissive
[root@node-3 ~]# setenforce 0
[root@node-3 ~]# getenforce
Disabled

四、部署私有仓库harbor

(注意:我用的外部数据库postgresql,也可以使用自带的数据库,此处不在赘述postgresql安装方法,如有需要后期会出。)
1.安装docker-compose

[root@node-3 ~]# mv ../docker-compose-linux-x86_64  /usr/local/bin/docker-compose
[root@node-3 ~]# chmod +x /usr/local/bin/docker-compose
[root@node-3 ~]# docker-compose --version

2.安装harbor

[root@node-3 ~]# tar -zxf harbor-offline-installer-v2.4.2.tgz
[root@node-3 ~]# cd harbor
[root@node-3 ~]# cp harbor.yml.tmpl harbor.yml
[root@node-3 ~]# vim harbor.yml
hostname: 192.168.200.153port: 8080
#注释 https 相关配置
# https related config
#https:# https port for harbor, default is 443#port: 443# The path of cert and key files for nginx#certificate: /your/certificate/path#private_key: /your/private/key/path# 配置对应的 url,这里顶格
#external_url: https://devharbor.ak.com#登入密码
harbor_admin_password: Csdn@123# 配置数据存储目录
data_volume: /srv/docker/harbor/datalocation:  /srv/docker/harbor/log
#配置外部数据库(如果使用默认数据库)
external_database:harbor:host: 192.168.200.151port: 5432db_name: harborusername: harborpassword: Csdn@123ssl_mode: disablemax_idle_conns: 2max_open_conns: 0notary_signer:host: 192.168.200.151port: 5432db_name: harbor_signerusername: harborpassword: Csdn@123ssl_mode: disablenotary_server:host: 192.168.200.151port: 5432db_name: harbor_serverusername: harborpassword: Csdn@123ssl_mode: disable
:wq
#数据库配置200.151操作(不使用外部数据库的忽略)
[root@localhost ~]# cd /srv/program/pgsql-10.20/
[root@localhost pgsql-10.20]# cd pgsql/
[root@localhost pgsql]# su postgres
[postgres@localhost pgsql]$ ./bin/psql
psql.bin (10.20)
Type "help" for help.postgres=#  create database harbor with encoding='utf8' owner=harbor;
postgres=#  create database harbor_server with encoding='utf8' owner=harbor;
postgres=#  create database harbor_signer with encoding='utf8' owner=harbor;
postgres=# \q
[postgres@localhost pgsql]$
#node3操作
#安装harbor
[root@node-3 harbor]# ./install.sh
#Harbor依赖的镜像及启动服务如下
[root@node-3 harbor]# docker-compose ps
NAME                COMMAND                  SERVICE             STATUS              PORTS
harbor-core         "/harbor/entrypoint.…"   core                running (healthy)
harbor-jobservice   "/harbor/entrypoint.…"   jobservice          running (healthy)
harbor-log          "/bin/sh -c /usr/loc…"   log                 running (healthy)   127.0.0.1:1514->10514/tcp
harbor-portal       "nginx -g 'daemon of…"   portal              running (healthy)
nginx               "nginx -g 'daemon of…"   proxy               running (healthy)   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
redis               "redis-server /etc/r…"   redis               running (healthy)
registry            "/home/harbor/entryp…"   registry            running (healthy)
registryctl         "/home/harbor/start.…"   registryctl         running (healthy)

访问地址: http://192.168.200.153:8080/harbor
用户: admin
密码:Csdn@123


因为我是搭建后写的博客所以已经有k8s镜像了

可以看到下方私有仓库地址为:192.168.200.153:8080/library

五、构建k8s集群

了解kubeadm命令:

kubeadm 命令
config: 配置管理命令
help:   查看帮助
init:   初始命令
join:   node加入集群的命令
reset:  还原状态命令
token:  token凭证管理命令
version:查看版本

1.列出部署kubernetes需要哪些镜像(在master主机操作)

[root@node-3 ~]#  kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.23.5
k8s.gcr.io/kube-controller-manager:v1.23.5
k8s.gcr.io/kube-scheduler:v1.23.5
k8s.gcr.io/kube-proxy:v1.23.5
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.1-0
k8s.gcr.io/coredns/coredns:v1.8.6
[root@node-3 ~]#

2.将所有需要的镜像导入私有仓库(在master主机操作)

# 从阿里云拉取镜像
[root@node-3 ~]# docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.23.5
[root@node-3 ~]# docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.23.5
[root@node-3 ~]# docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.23.5
[root@node-3 ~]# docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.23.5
[root@node-3 ~]# docker pull registry.aliyuncs.com/google_containers/pause:3.6
[root@node-3 ~]# docker pull registry.aliyuncs.com/google_containers/etcd:3.5.1-0
[root@node-3 ~]# docker pull registry.aliyuncs.com/google_containers/coredns:v1.8.6
# 导入私有仓库harbor
[root@node-3 ~]# docker push   192.168.200.153:8080/library/kube-apiserver:v1.23.5
[root@node-3 ~]# docker push   192.168.200.153:8080/library/kube-proxy:v1.23.5
[root@node-3 ~]# docker push   192.168.200.153:8080/library/kube-controller-manager:v1.23.5
[root@node-3 ~]# docker push   192.168.200.153:8080/library/kube-scheduler:v1.23.5
[root@node-3 ~]# docker push   192.168.200.153:8080/library/etcd:3.5.1-0
[root@node-3 ~]# docker push   192.168.200.153:8080/library/coredns:v1.8.6
[root@node-3 ~]# docker push   192.168.200.153:8080/library/pause:3.6
# 删除多余的阿里云镜像
[root@node-3 ~]# docker rmi registry.aliyuncs.com/google_containers/kube-apiserver:v1.23.5
[root@node-3 ~]# docker rmi registry.aliyuncs.com/google_containers/kube-controller-manager:v1.23.5
[root@node-3 ~]# docker rmi registry.aliyuncs.com/google_containers/kube-scheduler:v1.23.5
[root@node-3 ~]# docker rmi registry.aliyuncs.com/google_containers/kube-proxy:v1.23.5
[root@node-3 ~]# docker rmi registry.aliyuncs.com/google_containers/pause:3.6
[root@node-3 ~]# docker rmi registry.aliyuncs.com/google_containers/etcd:3.5.1-0
[root@node-3 ~]# docker rmi registry.aliyuncs.com/google_containers/coredns:v1.8.6

3.安装master主机

#私有仓库我用的harbor,看大家需要后期会发一个详细教程
#大体思路就是直接从共用仓库进行拉取,然后推送到本地的harbor私有仓库里
#如果没搭建私有仓库请使用imageRepository: registry.aliyuncs.com/google_containers
#kubectl、kubeadm支持自动补全功能,可以节省大量输入,自动补全脚本由 kubectl、kubeadm产生,仅需要在您的 shell 配置文件中调用即可。
#设置Tab补齐
[root@node-3 ~]# kubectl completion bash >/etc/bash_completion.d/kubectl
[root@node-3 ~]# kubeadm completion bash >/etc/bash_completion.d/kubeadm
# 注意 :配置完成以后需要退出,重新登录后才能生效
[root@node-3 ~]# exit
[root@node-3 ~]# kubeadm init --dry-run                   #环境检查,根据提示信息排错
#生成官方k8s配置文件
[root@node-3 ~]# kubeadm config print init-defaults >kubeadm-init.yaml
[root@node-3 ~]# vim kubeadm-init.yaml
06:    ttl: 24h0m0s                                    # token 生命周期
12:    advertiseAddress: 192.168.200.153               # apiserver 的IP地址
32:    imageRepository: 192.168.200.153:8080/library   # 镜像仓库地址
34:    kubernetesVersion: 1.23.5                       # 当前安装的 k8s 版本
36:    dnsDomain: cluster.local                        # 默认域名地址
37:    podSubnet: 10.244.0.0/16                        # 容器地址cidr,新添加
38:    serviceSubnet: 10.254.0.0/16                    # 服务地址cidr
#文件最后手动添加如下4行
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
:wq
[root@node-3 ~]# kubeadm init --config=kubeadm-init.yaml | tee master-init.log
#出现如下字段说明Ok
... ...
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
... ...
#以下命令复制保存一下,节点加入集群需要
kubeadm join 192.168.200.153:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:57ff39dfc6a30d52b95550ad2bc4986f24060e66ec96a00b2ae937da683c9213
[root@node-3 ~]# mkdir -p /root/.kube
[root@node-3 ~]# cp -i /etc/kubernetes/admin.conf /root/.kube/config
#启动服务并验证
[root@node-3 ~]# kubectl  get  componentstatuses       #或者kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE                         ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health":"true","reason":""}
[root@node-3 ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.5", GitCommit:"c285e781331a3785a7f436042c65c5641ce8a9e9", GitTreeState:"clean", BuildDate:"2022-03-16T15:58:47Z", GoVersion:"go1.17.8", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.5", GitCommit:"c285e781331a3785a7f436042c65c5641ce8a9e9", GitTreeState:"clean", BuildDate:"2022-03-16T15:52:18Z", GoVersion:"go1.17.8", Compiler:"gc", Platform:"linux/amd64"}
[root@node-3 ~]#

4.安装node节点并加入master

#以node4为例
#启动服务
[root@node-4 ~]# systemctl enable --now docker kubelet
#如果忘了保存加入集群的命令token 值可以通过以下命令查看(master主机操作)
[root@node-3 ~]#  kubeadm token create --ttl=0 --print-join-command
kubeadm join 192.168.200.153:6443 --token oqlqjr.joy5xjancokpg2co --discovery-token-ca-cert-hash sha256:77c4ed2bea586d49184d002ecb2d9476202d2890db5c1ec86f2dadfce2884879
#也可以重新创建(master主机操作)
[root@node-3 ~]# kubeadm token list                  # 列出 token
[root@node-3 ~]# kubeadm token delete <token>        # 删除 token
[root@node-3 ~]# kubeadm token create                # 创建 token
[root@node-3 ~]# kubeadm token create --ttl=0 --print-join-command  # 查看 token
#回到node4节点操作,加入master
[root@node-4 ~]# kubeadm join 192.168.200.153:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:57ff39dfc6a30d52b95550ad2bc4986f24060e66ec96a00b2ae937da683c9213
#node4、node5加入以后可以回到master验证
#由于我的网络组件已经安装完毕所以STATUS显示Ready,此时大家应该是NotReady
[root@node-3 ~]# kubectl get nodes
NAME     STATUS   ROLES                  AGE   VERSION
node-3   Ready    control-plane,master   2d    v1.23.5
node-4   Ready    <none>                 2d    v1.23.5
node-5   Ready    <none>                 2d    v1.23.5

六、配置calico网络插件

#获取官方配置文件(我用的当前最新calico 3.22.1支持k8s最新版1.23.5)
[root@node-3 ~]# wget https://docs.projectcalico.org/v3.22/manifests/calico.yaml --no-check-certificate
[root@node-3 ~]# vim calico.yaml
apiVersion: policy/v1
kind: PodDisruptionBudget# no effect. This should fall within `--cluster-cidr`.
- name: CALICO_IPV4POOL_CIDRvalue: "10.244.0.0/16"            #要和kubeadm-init.yaml中podSubnet一致# Cluster type to identify the deployment type
- name: CLUSTER_TYPEvalue: "k8s,bgp"# IP automatic detection
- name: IP_AUTODETECTION_METHODvalue: "interface=ens.*"          #根据自己的网卡填写,可以绑定具体的例如ens192# Auto-detect the BGP IP address.
- name: IPvalue: "autodetect"# Enable IPIP
- name: CALICO_IPV4POOL_IPIPvalue: "Never":wq
[root@node-3 ~]# kubectl apply -f calico.yaml
[root@node-3 ~]# kubectl get nodes     #STATUS是Ready则ok
NAME     STATUS   ROLES                  AGE   VERSION
node-3   Ready    control-plane,master   2d    v1.23.5
node-4   Ready    <none>                 2d    v1.23.5
node-5   Ready    <none>                 2d    v1.23.5
#查看k8s集群状态
[root@node-3 ~]#  kubectl get pods --all-namespaces
NAMESPACE     NAME                                       READY   STATUS    RESTARTS       AGE
kube-system   calico-kube-controllers-56fcbf9d6b-8kjjc   1/1     Running   1 (2d ago)     2d
kube-system   calico-node-24zd6                          1/1     Running   1 (2d ago)     2d
kube-system   calico-node-t78sj                          1/1     Running   0              2d
kube-system   calico-node-vtdtp                          1/1     Running   0              2d
kube-system   coredns-5546454b5c-8mzhz                   1/1     Running   0              2d
kube-system   coredns-5546454b5c-fmqn6                   1/1     Running   0              2d
kube-system   etcd-node-3                                1/1     Running   7 (2d ago)     2d
kube-system   kube-apiserver-node-3                      1/1     Running   4 (2d ago)     2d
kube-system   kube-controller-manager-node-3             1/1     Running   9 (23h ago)    2d
kube-system   kube-proxy-747w8                           1/1     Running   0              2d
kube-system   kube-proxy-qxf6d                           1/1     Running   1 (2d ago)     2d
kube-system   kube-proxy-v2n9j                           1/1     Running   0              2d
kube-system   kube-scheduler-node-3                      1/1     Running   17 (45h ago)   2d

READY全部在线集群搭建到此结束!

  图中最后两个NAMESPACE是我部署的kuboard组件用来代替kubernetes dashboard来管理k8s集群,在这里给大家简单展示一下:






七、结束

  感谢大家一直以来的支持与鼓励,感兴趣的小伙伴可以点一手关注,后期会推出更多精彩内容!

Kubernetes1.23.5集群部署相关推荐

  1. kubernetes-1.11.0集群部署之master集群 (二)

    kubernetes-1.11.0集群部署之master集群 (二) Master master 的组件有以下: 1. API ServerApi server提供HTTP/HTTPS RESTful ...

  2. 17_clickhouse分布式集群部署

    23.ClickHouse分布式集群部署 23.1.集群部署 23.1.1.准备工作 节点规划: 主机名 IP地址 分片 副本 clickhouse1 192.168.106.103 shard1 副 ...

  3. 《Linux运维实战:Centos7.6一键离线部署mongodb4.2.23副本集群》

    一.部署背景 由于业务系统的特殊性,我们需要面向不通的客户安装我们的业务系统,而作为基础组件中的mongodb针对不同的客户环境需要多次部署,作为一个运维工程师,提升工作效率也是工作中的重要一环.所以 ...

  4. Kubeadm部署Kubernetes1.18.6集群1

    Kubeadm 部署 Kubernetes1.18.6 集群 一.环境说明 主机名 IP地址 角色 系统 k8s-node-1 192.168.120.128 k8s-master Centos7.6 ...

  5. Kubeadm 部署 Kubernetes1.20.4集群

    Kubeadm 部署 Kubernetes1.20.4集群(2021-02-19) 一.环境说明 主机名 IP地址 角色 系统 Kubernetes 192.168.144.156 k8s-maste ...

  6. 这一篇 K8S(Kubernetes)集群部署 我觉得还可以

    点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 国内安装K8S的四种途径 Kubernetes 的安装其实并不复杂,因为Kubernetes 属 ...

  7. JAVA_OA(十四)番外:JAVAWEB防止表单重复提交的方法整合(包括集群部署)

    因为自己要用,所以查找了网络上javaweb项目防止表单重复提交的方法,有些部分不太好找,所以整合后贴出来,首先是孤傲苍狼的一部分博客文章,集群部署的解决方案在后面(注意大红字) 原文出处:孤傲苍狼的 ...

  8. K8S集群搭建:安装kubeadm集群部署工具

    将镜像包上传至服务器每个节点 mkdir /usr/local/k8s-install cd /usr/local/k8s-install XFTP上传安装文件 每个CentOS上安装Docker 使 ...

  9. ActiveMq消费端实现集群部署

    1.问题背景 一个事件中心接收网关通过ActiveMq上报的告警事件,处理后持久化到数据库,消息模型为发布订阅模式.为了实现高可用,决定将事件中心进行集群部署,运行两个实例. 但是由于消息模型为发布/ ...

最新文章

  1. Linux下出现Read-only file system的解决办法
  2. html css文本框按钮,css样式之区分input是按钮还是文本框的方法
  3. socket函数介绍
  4. maven,阿里云国内镜像,提高jar包下载速度
  5. asp.net 点击查询跳转到查询结果页面_如何控制报表组点查询后默认选择的 tab 页...
  6. 搜索引擎关键字智能提示的一种实现
  7. ML《决策树(三)CART》
  8. Oracle学习笔记:oracle服务在linux平台的启动问题
  9. 京东方OLED屏幕无缘iPhone 12首批供货,因测试未通过
  10. 在浏览器地址栏输入url的后的过程
  11. python '/'与'//'学习
  12. c 语言程序设计(清华大学郑莉),清华大学 C++程序设计语言 45 郑莉 视频教程
  13. 大数据做基础 构建流动人口健康屏障
  14. svn管理ad元件库_AD元器件库服务器管理指南
  15. ts视频下载 准备下载视频的你确定不进来看看吗
  16. 64卦加密解密(娱乐用)
  17. 2018年最新Python Flask打造一个视频网站实战视频教程分享
  18. 全志A64平台 TP9950 BT656输入驱动调试(1)环境搭建驱动编写
  19. OPPO号召力如此巨大,R11发布会邀来半个娱乐圈
  20. swiper修改分页器圆点颜色

热门文章

  1. 谷歌翻译网页无法翻译,最新解决方法
  2. 韩国美女连连看核心算法
  3. linux系统搭建论坛,Linux下搭建discuz论坛
  4. 什么是Hibernate方言和方言列表
  5. 在win2008安装GNS3出现的蓝屏问题
  6. 51之hex程序烧到单片机
  7. java环形buff_环形缓冲区.ringbuff(C#和java)
  8. 将大文件夹下的小文件夹全部统一命名为拼音
  9. 文本与文本处理(一)
  10. Shell脚本编程--cut命令