手把手搭建kubernetes环境(一)
k8s解决了什么问题
- Kubernetes (k8s) 解决了在分布式环境下部署、扩展和管理容器化应用程序的一些问题,包括:
- 自动化部署:Kubernetes 允许用户定义应用程序的部署规范,并自动执行这些规范以创建、更新或删除应用程序。
- 自动化缩放:Kubernetes 可以根据应用程序的负载情况自动进行水平伸缩,使得应用程序始终具有合适的资源并能够应对流量高峰。
- 自我修复:Kubernetes 检测应用程序故障并自动重启容器实例。此外,如果一个节点失败,Kubernetes 会自动将其上的容器迁移到其他可用节点上。
- 负载均衡:Kubernetes 提供了内置的负载均衡功能,可以将流量分配到多个容器实例中。
- 存储编排:Kubernetes 提供了存储编排功能,可以动态地管理容器的持久存储,并将存储卷附加到需要它们的容器上。
- 配置管理:Kubernetes 允许集中管理应用程序的配置信息,从而简化了配置管理的工作。
- 跨云平台支持:Kubernetes 提供了跨多个公有云和私有云环境的支持,使得应用程序可以更轻松地在不同的云平台之间移植。

kubernetes 概念
- Master:集群控制节点,每个集群要求至少有一个 Master 节点来负责集群的管控。
- Node:工作负载节点,由 Master 分配容器到这些 Node 工作节点上,然后 Node 节点上的 Docker 负责容器的运行。
- Pod:Kubernetes 的最小控制单元,容器都是运行在 Pod 中的,一个 Pod 中可以有一个或多个容器。
- Controller:控制器,通过它来实现对 Pod 的管理,比如启动 Pod 、停止 Pod 、伸缩 Pod 的数量等等。
- Service:Pod 对外服务的统一入口,其下面可以维护同一类的多个 Pod 。
- Label:标签,用于对 Pod 进行分类,同一类 Pod 会拥有相同的标签。
- NameSpace:命名空间,用来隔离 Pod 的运行环境。
角色 | IP地址 | 操作系统 | 配置 | hostname |
Master | 192.168.65.100 |
CentOS 7.9,基础设施服务器 | 2核CPU,2G内存,40G硬盘 | k8s-master |
Node1 | 192.168.65.101 |
CentOS 7.9,基础设施服务器 | 2核CPU,2G内存,40G硬盘 | k8s-node1 |
Node2 | 192.168.65.102 |
CentOS 7.9,基础设施服务器 | 2核CPU,2G内存,40G硬盘 | k8s-node2 |
搭建DashBoard
1.4 搭建流程
- ① 准备 3 台机器,要求网络互通(如果是云服务器,要求私网互通;如果是虚拟机,要求网络互通)。
- ② 在 3 台机器上安装 Docker 容器化环境。
-
③ 安装 Kubernetes :
- 3 台机器安装核心组件:kubeadm(创建集群的引导工具)、kubelet 、kubectl(程序员使用的命令行)。
- kubelet 可以直接通过容器化的方式创建出 Kubernetes 的核心组件,如:Controller Manager、Scheduler 等。
- 由 kubeadm 引导创建 Kubernetes 集群。
第二章:Kubernetes 安装(v1.21)
2.1 Kubernetes 和 Docker 之间的版本对应关系

从文档中,我们可以知道 Docker 的版本是 v20.10 ,对应的 Kubernetes 的版本是 v1.21 。
2.2 前置条件
- 如果是虚拟机则需要让三台机器互通,最简单的做法就是关闭防火墙。
systemctl stop firewalld
systemctl disable firewalld
2.3 准备工作
2.3.1 升级系统内核
- 查看当前系统的版本:
cat /etc/redhat-release
- 查看当前系统的内核:
uname -sr

默认的 3.10.0 实在是太低了。
- 在 CentOS 7.x 上启用 ELRepo 仓库:
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm

- 查看可用的系统内核相关包:
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

- 安装最新主线内核版本:
yum -y --enablerepo=elrepo-kernel install kernel-ml

- 设置默认的内核版本:
vim /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=0 # 修改此处,原来是 saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
- 重新创建内核配置:
grub2-mkconfig -o /boot/grub2/grub.cfg

- 查看当前系统的内核:
uname -sr

2.3.2 设置主机名
- 命令:
# 192.168.65.100
hostnamectl set-hostname k8s-master
# 192.168.65.101
hostnamectl set-hostname k8s-node1
# 192.168.65.102
hostnamectl set-hostname k8s-node2
2.3.3 主机名解析
- 为了方便后面集群节点间的直接调用,需要配置一下主机名解析,企业中推荐使用内部的 DNS 服务器。
cat >> /etc/hosts << EOF
127.0.0.1 $(hostname)
192.168.65.100 k8s-master
192.168.65.101 k8s-node1
192.168.65.102 k8s-node2
EOF
2.3.4 时间同步
- Kubernetes 要求集群中的节点时间必须精确一致,所以在每个节点上添加时间同步:
yum install ntpdate -y
ntpdate time.windows.com
2.3.5 关闭 SELinux
- 查看 SELinux 是否开启:
getenforce
- 永久关闭 SELinux ,需要重启:
sed -i 's/enforcing/disabled/' /etc/selinux/config
- 关闭当前会话的 SELinux ,重启之后无效:
setenforce 0
2.3.6 关闭 swap 分区
- 永久关闭 swap ,需要重启:
sed -ri 's/.*swap.*/#&/' /etc/fstab
- 关闭当前会话的 swap ,重启之后无效:
swapoff -a
2.3.7 将桥接的 IPv4 流量传递到 iptables 的链
- 修改 /etc/sysctl.conf 文件:
# 如果有配置,则修改
sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g" /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g" /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g" /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6=1#g" /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6=1#g" /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6=1#g" /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding=1#g" /etc/sysctl.conf
# 可能没有,追加
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
- 加载 br_netfilter 模块:
modprobe br_netfilter
- 持久化修改(保留配置包本地文件,重启系统或服务进程仍然有效):
sysctl -p

2.3.8 开启 ipvs
- 在 Kubernetes 中 service 有两种代理模型,一种是基于 iptables ,另一种是基于 ipvs 的。ipvs 的性能要高于 iptables 的,但是如果要使用它,需要手动载入 ipvs 模块。
- 在三台机器安装 ipset 和 ipvsadm :
yum -y install ipset ipvsadm
- 在三台机器执行如下脚本:
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
EOF
- 授权、运行、检查是否加载:
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

2.3.9 重启
- 重启三台机器:重启后输入用户名密码
reboot
2.3.10 Docker 安装
- 三台机器上都安装 Docker 。
- 卸载旧版本:
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- yum 安装 gcc 相关:
yum -y install gcc
yum -y install gcc-c++

- 安装所需要的软件包:
yum -y install yum-utils
- 设置 stable 镜像仓库:
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 更新 yum 软件包索引:
yum makecache fast
- 查看存储库中 Docker 的版本:
yum list docker-ce --showduplicates | sort -r
- 安装指定版本的 Docker(v20.10) :
yum -y install docker-ce-3:20.10.8-3.el7.x86_64 docker-ce-cli-1:20.10.8-3.el7.x86_64 containerd.io

- 启动 Docker:
# 启动 Docker
systemctl start docker
# 开启自动启动
systemctl enable docker
- 验证 Docker 是否安装成功:
docker -v

- 阿里云镜像加速:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://du3ia00u.mirror.aliyuncs.com",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://registry.docker-cn.com",
"https://docker.mirrors.sjtug.sjtu.edu.cn"
],
"live-restore": true,
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"},
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2.3.11 添加阿里云的 Kubernetes 的 YUM 源
- 由于 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
2.3.12 安装 kubelet 、kubeadm 和 kubectl
yum install -y kubelet-1.21.10 kubeadm-1.21.10 kubectl-1.21.10

- 为了实现 Docker 使用的 cgroup drvier 和 kubelet 使用的 cgroup drver 一致,建议修改
/etc/sysconfig/kubelet
文件的内容:
vim /etc/sysconfig/kubelet
# 修改
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

- 设置为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动:
systemctl enable kubelet
2.4 查看 Kubernetes 安装所需镜像
- 查看 Kubernetes 安装所需镜像:
kubeadm config images list
2.5 下载 Kubernetes 安装所需镜像
- 三台机器下载镜像:
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.10
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.10
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.10
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.10
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.0
- 给 coredns 镜像重新打 tag :
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.0 registry.cn-hangzhou.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
2.6 部署 Kubernetes 的 Master 节点
- 在 192.168.65.100 机器上部署 Kubernetes 的 Master 节点:
# 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里需要指定阿里云镜像仓库地址
kubeadm init \
--apiserver-advertise-address=192.168.65.100 \
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version=v1.21.10 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16
注意:
- apiserver-advertise-address 一定要是主机的 IP 地址。
- apiserver-advertise-address 、service-cidr 和 pod-network-cidr 不能在同一个网络范围内。
- 不要使用 172.17.0.1/16 网段范围,因为这是 Docker 默认使用的。

- 日志:
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/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.65.100:6443 --token tluojk.1n43p0wemwehcmmh \
--discovery-token-ca-cert-hash sha256:c50b25a5e00e1a06cef46fa5d885265598b51303f1154f4b582e0df21abfa7cb
- 根据日志提示操作,在 192.168.65.100 执行如下命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 如果是 root 用户,还可以执行如下命令
export KUBECONFIG=/etc/kubernetes/admin.conf
- 默认的 token 有效期为 2 小时,当过期之后,该 token 就不能用了,这时可以使用如下的命令创建 token :
kubeadm token create --print-join-command
# 生成一个永不过期的token
kubeadm token create --ttl 0 --print-join-command
2.7 部署 Kubernetes 的 Node节点
根据日志提示操作,在 192.168.65.101 和 192.168.65.102 执行如下命令:
kubeadm join 192.168.65.100:6443 --token tluojk.1n43p0wemwehcmmh \
--discovery-token-ca-cert-hash sha256:c50b25a5e00e1a06cef46fa5d885265598b51303f1154f4b582e0df21abfa7cb
2.8 部署网络插件
Kubernetes 支持多种网络插件,比如 flannel、calico、canal 等,任选一种即可,本次选择 calico(在 192.168.65.100 节点上执行,网络不行,请点这里
calico.yaml(185 KB)
)。 ●calico 和 k8s 的版本对应 。
kubectl apply -f https://projectcalico.docs.tigera.io/v3.19/manifests/calico.yaml
- 查看部署 CNI 网络插件进度:
kubectl get pods -n kube-system
watch kubectl get pods -n kube-system
2.9 查看节点状态
- 在 Master(192.168.65.100)节点上查看节点状态:
kubectl get nodes

2.10 设置 kube-proxy 的 ipvs 模式
- 在 Master(192.168.65.100)节点设置 kube-proxy 的 ipvs 模式:
kubectl edit cm kube-proxy -n kube-system
apiVersion: v1
data:
config.conf: |-
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: 0.0.0.0
bindAddressHardFail: false
clientConnection:
acceptContentTypes: ""
burst: 0
contentType: ""
kubeconfig: /var/lib/kube-proxy/kubeconfig.conf
qps: 0
clusterCIDR: 10.244.0.0/16
configSyncPeriod: 0s
conntrack:
maxPerCore: null
min: null
tcpCloseWaitTimeout: null
tcpEstablishedTimeout: null
detectLocalMode: ""
enableProfiling: false
healthzBindAddress: ""
hostnameOverride: ""
iptables:
masqueradeAll: false
masqueradeBit: null
minSyncPeriod: 0s
syncPeriod: 0s
ipvs:
excludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
strictARP: false
syncPeriod: 0s
tcpFinTimeout: 0s
tcpTimeout: 0s
udpTimeout: 0s
kind: KubeProxyConfiguration
metricsBindAddress: ""
mode: ""
nodePortAddresses: null
minSyncPeriod: 0s
syncPeriod: 0s
ipvs:
excludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
strictARP: false
syncPeriod: 0s
tcpFinTimeout: 0s
tcpTimeout: 0s
udpTimeout: 0s
kind: KubeProxyConfiguration
metricsBindAddress: ""
mode: "ipvs" # 修改此处
...
- 删除 kube-proxy ,让 Kubernetes 集群自动创建新的 kube-proxy :
kubectl delete pod -l k8s-app=kube-proxy -n kube-system
2.11 让 Node 节点也能使用 kubectl 命令
- 默认情况下,只有 Master 节点才有 kubectl 命令,但是有些时候我们也希望在 Node 节点上执行 kubectl 命令:
# 192.168.65.101 和 192.168.65.102
mkdir -pv ~/.kube
touch ~/.kube/config
# 192.168.65.100
scp /etc/kubernetes/admin.conf root@192.168.65.101:~/.kube/config
# 192.168.65.100
scp /etc/kubernetes/admin.conf root@192.168.65.102:~/.kube/config
2.12 Kubernetes 安装 Nginx
- 部署 Nginx :
kubectl create deployment nginx --image=nginx:1.14-alpine
暴露端口:
kubectl expose deployment nginx --port=80 --type=NodePort
查看服务状态:
kubectl get pods,svc

在浏览器输入:
http://192.168.65.100:30308

3 部署DashBoard
概述
- 之前在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。其实,为了提供更丰富的用户体验,kubernetes还开发了一个基于web的用户界面(DashBoard)。用户可以使用DashBoard部署容器化的应用,而且还可以监控应用的状态,执行故障排查以及管理kubernetes中的各种资源。
3.1 下载yaml,并运行DashBoard
- 下载yaml(网络不行,请点这里📎recommended.yaml):下载后上传到master服务器
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
- 修改kubernetes-dashboard的Service类型
vim recommended.yaml
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort # 新增
ports:
- port: 443
targetPort: 8443
nodePort: 30009 # 新增
selector:
k8s-app: kubernetes-dashboard
- 部署DashBoard:
kubectl create -f recommended.yaml
- 查看namespace为kubernetes-dashboard下的资源:
kubectl get pod,svc -n kubernetes-dashboard

3.2 创建账户,获取token
- 创建账户:
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboar

- 授权:
kubectl create clusterrolebinding dashboard-admin-rb --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin

- 获取账号token:
kubectl get secrets -n kubernetes-dashboard | grep dashboard-admin

kubectl describe secrets dashboard-admin-token-b992l -n kubernetes-dashboard
注意这里换成自己的admin

3.3 通过浏览器访问DashBoard的UI
- 在登录页面上输入上面的token,访问地址为https://192.168.101.131:30009#/login:


本文来自博客园,作者:Joson6350,转载请注明原文链接:https://www.cnblogs.com/josonhuang/p/17209464.html
分类:
性能测试
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示