Kubernetes部署搭建及测试
Kubernetes(K8s)集群搭建
环境准备
至少两台虚拟机环境,我这准备了三台,一台用做master、两台node用做worker。要求:
硬盘配置:内存2GB或更多,CPU2核或更多,硬盘30GB或更多
集群中的所有机器之间网络互通
可以访问外网,需要拉取镜像
禁止swap分区
主机IP规划
主机名 IP 功能 master1 192.168.137.4 Master、etcd、registry node1 192.168.137.14 node1 node2 192.168.137.24 node2 编辑网卡文件,配置成可以访问外网就行(就是可以联网),不管虚拟机用什么网络模式,我这里用的都是仅主机模式网络(在虚拟机中有仅主机、NAT、桥连接这三种网络模式的配置方法,每种都有所不一样,我这下面的只是在仅主机模式下配置,NAT也与它很像,注意一下不要配错了),如下:
###/etc/sysconfig/network-scripts/该文件里放的基本上是网络配置的文件 ###我这里网卡文件时这张ifcfg-ens33 ,master0、node0、node2都要配置 vi /etc/sysconfig/network-scripts/ifcfg-ens33 ###内容如下 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static ###原先是dhcp的,要改成静态的static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 ###网卡名称 UUID=572cf124-6ac3-48c3-abf1-7e2cdbf85e86 DEVICE=ens33 ###设备名称 ONBOOT=yes ###将no改为yes,意思是每次重启时自动重启了网卡网络 IPADDR=192.168.137.4 ###主机ip,不要与之前有的ip重复了,会有冲突 GATEWAY=192.168.137.1 ###主机模式下的网关 NETMASK=255.255.255.0 ###子网掩码 DNS1=8.8.8.8 ###DNS解析,解析外网域名,使其能够访问
设置hosts解析
vi /etc/hosts ####添加集群主机ip和主机名 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.137.4 master1 192.168.137.14 node1 192.168.137.24 node2
设置集群之间免密钥登录(只是在测试环境中,在实际开发中要分配集群之间的权限)
###配置各个节点之间免密钥,一路按enter(回车)键 ssh-keygen ###配置后信息如下 Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:6XhtjiIimXIjHnAfV6qT6Lk8Leirh1WAaMfP4DF5li8 root@master0 The key's randomart image is: +---[RSA 2048]----+ |... . . | |o..B + | |. o.O . . | | ..E + . | |. ... + S | |...o = o . | | B..= . o o | |OoO.o... + | |*O** . .. . | +----[SHA256]----- ###其次将要免密钥节点ip或主机名赋给主机就行,中间有一个问题是:你确定要继续连接吗? ###我们要连接的话只有敲 :yes ###后面还要输入要连接的那台节点的密码 ssh-copy-id root@master0 或 ssh-copy-id root@ip ###成功结果信息 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub" The authenticity of host 'master0 (192.168.137.5)' can't be established. ECDSA key fingerprint is SHA256:vDUJyx5chWc8YspAX24zmVeh3MrCsPzRg4O9S0ZgVZE. ECDSA key fingerprint is MD5:14:dc:ce:f6:b0:43:86:c9:6b:5e:a0:f8:88:38:a2:21. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@master0's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@master0'" and check to make sure that only the key(s) you wanted were added. ###集群中各个节点之间都要将己方或对方写入免密钥登录,这要方便后续操作
关闭防火前和seliunx
###临时关闭selinux setenforce 0 ###永久关闭selinux,编辑/etc/selinux/config文件(将SELINUX的值改为disabled) ###关闭防火墙 systemctl stop firewalld ###重启后又会打开 systemctl disable firewalld ###直接点,使防火墙瘫痪用不了(要用的话,重新安装) ###查看防火墙状态 systemctl status firewalld ### 只要不是绿色的active(活跃状态就行) firewall-cmd --state
关闭swap分区
###临时关闭 swapoff -a ###永久关闭需要写入fatab,就编辑/etc/fstab文件,将有swap字段的那一行给注释掉,如下: # # /etc/fstab # Created by anaconda on Thu Nov 3 13:14:40 2022 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/centos-root / xfs defaults 0 0 UUID=68fc3521-ba13-4bf6-8ff5-5ab55ce62b2d /boot xfs defaults 0 0 ##/dev/mapper/centos-swap swap swap defaults 0 0
要将桥接的IPV4流量传递给iptables的链:
###编辑/etc/sysctl.d/k8s.conf文件 ###内容如下 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 vm.swappiness = 0 ###加载br_netfilter模块 modprobe br_netfilter ###查看是否加载 lsmod | grep br_netfilter ###返回信息如下 br_netfilter 22256 0 bridge 151336 1 br_netfilter ###生效 sysctl --system ###它会返回值,信息如下 * Applying /usr/lib/sysctl.d/00-system.conf ... net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0 * Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ... kernel.yama.ptrace_scope = 0 * Applying /usr/lib/sysctl.d/50-default.conf ... kernel.sysrq = 16 kernel.core_uses_pid = 1 kernel.kptr_restrict = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.promote_secondaries = 1 net.ipv4.conf.all.promote_secondaries = 1 fs.protected_hardlinks = 1 fs.protected_symlinks = 1 * Applying /etc/sysctl.d/99-sysctl.conf ... * Applying /etc/sysctl.d/k8s.conf ... net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 vm.swappiness = 0 * Applying /etc/sysctl.conf ...
让集群之间的 时间同步
###这里用的是ntpdata,安装下载就是了 yum install ntpdate -y ntpdate time.windows.com
升级系统内核
###检测当前安装的内核版本 uname -rs ###我这里是用yum直接联网升级,CentOS 允许使用 ELRepo,这是一个第三方仓库,可以将内核升级到最新版本。 ###要在 CentOS 7 上启用 ELRepo 仓库,运行如下命令: rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org#导入该源的秘钥 ###启用该源仓库 rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm ###查看有有哪些内核版本可供安装,我一般是直接要最新的 yum --disablerepo="*" --enablerepo="elrepo-kernel" list available ###开始安装 yum -y --enablerepo=elrepo-kernel install 所需要的版本,从查看中选 ###等它完成后,直接重启,开机页面下可以自选内核版本进去 ###与此同时,我将新的版本设置成默认启动项,就要设置/etc/default/grub文件 ###将里面的 GRUB_DEFAULT= 参数的值改为 0 就行了
安装Docker
创建阿里云镜像,目的是优先从阿里云获取镜像,加快docker的镜像拉取
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
直接开始安装Docker
yum -y install docker-ce###可查看docker安装的版本,要是自己想换一个版本,安装时加上版本号就行 docker version
配置docker镜像加速器
###我这里用的是阿里的 vi/etc/docker/daemon.json ###内容 {"registry-mirrors": ["https://rjvdwxr1.mirror.aliyuncs.com"] }###加载刷新该文件 systemctl daemon-reload###重启Docker systemctl restart docker###开机自启 systemctl enable docker
安装Kubernetes
Kubernetes的组件
master主机上192.168.137.5必须要有的组件:
etcd:提供分布式数据存储的数据库吧,用于持久化存储k8s集群的配置和状态
kube-apiserver:api service提供了http rest接口,是整个集群的入口,K8s其它组件之间不直接通信,而是通过API server通信的。(只有API server连接了etcd,即其它组件更新K8s集群的状态时,只能通APIserver读写etcd中的数据)
kube-scheduler:scheduler负责资源的调度
kube-controller-manager:整个集群的管理控制中心,此组件里面是由多个控制器组成的,如:Replication Manager(管理ReplicationController 资源),ReplicaSet Controller,PersistentVolume controller。主要作用用来复制组件、追踪工作结点状态、处理失败结点
node(worker)节点机上192.168.137.14、192.168.137.24必须要有的组件:
flannel:是用来支持网络通信的
kube-proxy:用来负载均衡网络流量
kubelet:用来管理node节点机上的容器
docker:运行项目镜像容器的组件
Kubernetes(k8s)安装步骤
配置k8s下载资源配置文件
vi /etc/yum.repos.d/kubernetes.repo ###内容 [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
安装 kubelet kubeadm kubectl
###版本自行选择 yum install -y --nogpgcheck kubelet-1.23.5 kubeadm-1.23.5 kubectl-1.23.5###kubelet :运行在cluster,负责启动pod管理容器 ###kubeadm :k8s快速构建工具,用于初始化cluster ###kubectl :k8s命令工具,部署和管理应用,维护组件###查看是否安装成功 kubelet --version kubectl version kubeadm version ###有版本信息返回
还要去拉取init-config配置 并修改配置
###init-config 主要是由 api server、etcd、scheduler、controller-manager、coredns等镜像构成 kubeadm config print init-defaults > init-config.yaml###修改拉取下来的init-config.yaml文件 ###内容如下 apiVersion: kubeadm.k8s.io/v1beta3 bootstrapTokens: - groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authentication kind: InitConfiguration localAPIEndpoint:advertiseAddress: 192.168.137.4 ###管理节点的IPbindPort: 6443 nodeRegistration:criSocket: /var/run/dockershim.sockimagePullPolicy: IfNotPresentname: master1 ###管理节点名称taints: null --- apiServer:timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta3 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: {} etcd:local:dataDir: /var/lib/etcd imageRepository: registry.aliyuncs.com/google_containers###换成阿里云的,不然拉取镜像很慢 kind: ClusterConfiguration kubernetesVersion: 1.23.0 ###版本号 networking:dnsDomain: cluster.localserviceSubnet: 10.96.0.0/12 scheduler: {}
配置好后,拉取k8s相关镜像
kubeadm config images pull --config=init-config.yaml ###两种都可以 kubeadm config images list --config init-config.yaml
初始化master节点 其他node节点通过 kubeadm join 进来
kubeadm init --config=init-config.yaml
根据初始化成功的页面提示下一步,用产生的token让其它工作节点加入
###初始化成功后又提示###让其它节点加入 kubeadm join 192.168.137.4:6443 --token token###在master节点查看 加入的node节点 或删除节点 kubectl get nodes kubectl delete nodes 节点名称###master节点删除node节点后,node节点再次加入需要在node节点执行 kubeadm reset
部署网络插件 kube-flannel.yml 并 应用获取运行中容器
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yaml###应用 kubectl apply -f kube-flannel.yaml
这个运行后,可以让整个集群进入准备状态
[root@master1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master1 Ready control-plane,master 9d v1.23.5 node1 Ready <none> 9d v1.23.5
要是还没进入准备状态,就说明docker与kubelet的cgroup 驱动不一致,它们两驱动是需要一致的
###查看kubelet驱动 cat /var/lib/kubelet/config.yaml |grep group ###可以看到 [root@master1 ~]# cat /var/lib/kubelet/config.yaml |grep group cgroupDriver: systemd###编辑docker的驱动 [root@master1 ~]# cat /etc/docker/daemon.json {"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://rjvdwxr1.mirror.aliyuncs.com"] }
重新部署网络插件那一步,直到集群状态都进入了准备状态
[root@master1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master1 Ready control-plane,master 9d v1.23.5 node1 Ready <none> 9d v1.23.5
安装Dashboard
官网下载Dashboard所需的yaml文件
wget http://120.78.77.38/file/kubernetes-dashboard.yaml###加载应用上 kubectl apply -f kubernetes-dashboard.yaml###查看该命名空间的Pod状态 [root@master1 ~]# kubectl get pods -n kubernetes-dashboard NAME READY STATUS RESTARTS AGE dashboard-metrics-scraper-c698c976-69xgb 1/1 Running 12 (52m ago) 8d kubernetes-dashboard-79cd8d986-jjxwj 1/1 Running 12 (52m ago) 8d
查看到该服务的token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret |awk '/dashboard-admin/{pirnt $1}')###一小段 ca.crt: 1099 bytes namespace: 11 bytes token: eyJhbGciOiJSUzI1NiIsImtpZCI6InpULWwwbXVkMkw2UzBMa3pzc1F0YkVveVlsN29Gb01PdVJWRjV1R1gzWm8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJ0dGwtY29udHJvbGxlci10b2tlbi1jcDJ4OCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJ0dGwtY29udHJvbGxlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImZlNzcxYjZmLTA0NDMtNDg0Ny05ZGMyLTgzMjFjOTNiNjM0MiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTp0dGwtY29udHJvbGxlciJ9.BVVYF1oEkMzEoIlDKkwb8d6N445W8oXpGl6Xwjnu5em4zQZ38rFbDahR9Wfg54pnBYNYGRXOzBiLI0OiFJytWLQSYm0cvjxPes7CMm_zKDXcDKDOaX_MK3n-NzDuRm8kxnwiYVBD1WQfg_axiPLbRyGHRDbwClYHaxxmC9H04UyORLvJ9GbJwkt1632c9HAaI1bd17glmLZqV5wZHVnfk7l2_39B_J0zIkvy3XEOIKDAzgUc4cXjgQELuRIy443kUU7xhVuAD8cbKHnEZLZn2u7YMt06FBCGD-Jcoa29B03rOorskwyrxpO5x7R_uUegjEBzLr4DN4s0ND0gQ7yxxQ###查询集群最高权限的令牌,此Token拥有 ClusterAdmin 的权限,可以执行所有操作 echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep ^kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)
浏览器访问加入的工作节点192.168.137.17:端口
###查看该命名空间服务 [root@master1 ~]# kubectl --namespace=kubernetes-dashboard get service kubernetes-dashboard NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes-dashboard NodePort 10.99.103.215 <none> 443:30001/TCP 8d###Port后面的30001就是端口 ###用火狐浏览器访问,输入token就登陆了,其它浏览器比较麻烦
测试集群
能登录进dashboard里面就是部署成功了
也可以自己部署一个微服务上去
Kubernetes功能
NameSpace
创建命名空间,用以隔绝不同类型的各种业务服务
kubectl creat namespace liaocaifengtest
Deployment
用yaml文件来创建一个deploy,文件名deploy.yaml
--- apiVersion: apps/v1 kind: Deployment metadata:name: nginx-app-testnamespace: liaocaifengtest spec:replicas: 2selector:matchLabels:app: nginx-app-testtemplate:metadata:labels:app: nginx-app-testspec:containers:- name: nginx-app-testimage: nginxports:- containerPort: 80
应用上
kubectl apply -f deploy.yaml
Service
我们用 yaml 资源清单文件创建 NodePort,用来集群外部访问:
###yaml文件里的内容 --- apiVersion: v1 kind: Deployment metadata:name: nginx-appnamespace: liaocaifengtest spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxports:- containerPort: 80 --- apiVersion: v1 kind: Service metadata:name: nginx-app-svcnamespace: liaocaifengtest spec:type: NodePortports:- protocol: TCPnodePort: 30005port: 80targetPort: 80selector:app: nginx
后面用命令创建
kubectl apply -f yaml文件的名称
查看以liaocaifengtest命名空间里的服务
kubectl get svc -n liaocaifengtest
[注意] 2022年11月15日将材料论文提交给老师邮箱,于19日答辩完将上传在本人CSDN账号或者其它论坛上
Kubernetes部署搭建及测试相关推荐
- 项目部署时网关怎么回事_使用Kubernetes部署聊天网关(或技术按预期运行时)...
项目部署时网关怎么回事 by Richard Li 理查德·李(Richard Li) 使用Kubernetes部署聊天网关(或技术按预期运行时) (Using Kubernetes to deplo ...
- 用Kubernetes部署超级账本Fabric的区块链即服务(1)
用Kubernetes部署超级账本Fabric的区块链即服务(1) 2017年08月13日 00:00:00 阅读数:937 题图摄于旧金山市区:云海中的 Twin Peaks 不久前,我们发表了如何 ...
- 基于Kubernetes的分布式压力测试方案
压力测试是用来检测系统承载能力的有效手段.在系统规模较小的时候,在一台空闲的服务器上使用[ab],[wrk],[siege]等工具发起一定量的并发请求即可得到一个初步的测试结果.但在系统复杂度逐步提高 ...
- Kubernetes入门--搭建Kubernetes集群,并启动容器服务
英文原作者:Ben Cane 翻译作者:Miazzy 翻译&转载:https://blog.codeship.com/getting-started-with-kubernetes/ Kub ...
- Docker学习总结(23)——Docker搭建大规模测试环境的实践
内容来源:2017年4月8日,第四范式资深测试开发工程师孙高飞在"饿了么技术沙龙[第四弹]北京研发中心测试专场"进行<docker搭建大规模测试环境的实践>演讲分享.I ...
- kubernetes部署nfs持久存储(静态和动态)
kubernetes部署nfs持久存储(静态和动态) NFS简介 NFS是网络文件系统Network File System的缩写,NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地的文 ...
- Kubernetes二进制搭建集群(保姆级)
Kubernetes二进制搭建集群(保姆级教程) 1.1 环境准备 版本说明 签名工具: 虚拟机/服务器配置 1.2 系统初始化(所有节点均需操作) 1.2.1 主机名解析 1.2.2 时间同步(所有 ...
- 《Kubernetes部署篇:基于docker使用kubespray工具部署高可用K8S集群(国内互联网方案四)》
文章目录 一.部署背景简介 二.部署工具介绍 三.部署方案介绍 四.部署环境信息 五.部署资源下载 六.部署准备工作 6.1.系统内核升级 6.2.设置主机名 6.3.环境初始化 6.4.ssh多机互 ...
- 《Kubernetes部署篇:基于docker使用kubespray工具离线部署高可用K8S集群(国内专网方案)》
文章目录 一.部署背景简介 二.部署工具介绍 三.部署方案介绍 四.部署环境信息 五.部署资源下载 六.部署准备工作 6.1.系统内核升级 6.2.设置主机名 6.3.环境初始化 6.4.ssh多机互 ...
最新文章
- PNAS:微生物组分析揭示人类皮肤的独特性
- 机器人的兴起:洞察2020全球机器人市场【Part 1】
- Epplus:导出Excel
- TCP 、UDP各自的优缺点
- (转载)jQuery 1.6 源码学习(一)——core.js[1]之基本架构
- delphi ui编辑工具源码_一种无侵入比swagger-ui兼容性更好更简单的API文档生成方案
- 网络编程(part2)--文件读写之打开/读取/写入
- P1266 速度限制
- javascript实现较全功能注册表单
- 西南石油大学计算机科学学院教授,张小洪(计算机科学学院)老师 - 西南石油大学 - 院校大全...
- [Java] 蓝桥杯BASIC-25 基础练习 回形取数
- 从武则天的故事看职场生涯规划的一个最重要方面
- MacBook Air 2013双系统装机
- win10设置透明任务栏
- OpenGL ES着色器语言----------------储存修饰符
- 2750 心系南方灾区
- 微信小程序-网易云音乐
- matlab geoshow 地质,Matlab 绘制三维立体图(以地质异常体为例)
- 《高等数学A》课堂笔记——高分必过
- 异地多活场景下的数据同步之道
热门文章
- 魔鬼经济学---趣记
- 买卖提将养的一缸金鱼分五次出售系统上一次卖出全部的一半加二分之一条; 第二次卖出余下的三分之一加三分之一条; 第三次卖出余下的四分之一加四分之一条; 第四次卖出余下的五分之一加五分之一条; 最后卖出余
- java VPI文档 (JDK帮助文档)
- “云+医疗”时代来临,医疗桌面云市场步入快车道
- PostgreSQL 级联删除
- R语言如何自定义调整所绘图形的大小?
- 程序员的职业素养 读书笔记 - 第6章 练习
- ZDHC认证咨询,相关品牌产品的生产过程都需要管控工厂限制物质列表有哪些
- 【调剂】重庆三峡学院 计算机科学技术、化学化工、环境工程交叉领域招收调剂...
- FCC认证是什么流程周期?