14.K8S+KubeSphere+DevOps

容器管理平台KubeSphere的使用 KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的分布式操作系统,完全开源,支持多云与多集群管理,提供全栈的 IT 自动化运维能力,简化企业的 DevOps 工作流。作为全栈的多租户容器平台,KubeSphere 提供了运维友好的向导式操作界面,帮助企业快速构建一个强大和功能丰富的容器云平台。 阅读详情

学习网址:
k8s中文社区:https://www.kubernetes.org.cn/
k8s社区文档:http://docs.kubernetes.org.cn/

k8s官网:https://kubernetes.io/zh/
k8s官方文档:https://kubernetes.io/zh/docs/home/

kubesphere官方文档:https://kubesphere.io/zh/docs/
kubesphere文档中心:https://v2-1.docs.kubesphere.io/docs/zh-CN/release/release-v211/

三个时代

传统时代

在这里插入图片描述

描述:
	在硬件上搭建操作系统,部署多个APP应用
缺点:
	资源应用不充分不隔离,部署的复杂性(迁移时所有环境都需要重新搭建,可以整个系统克隆)

虚拟化时代

在这里插入图片描述

描述:
	在操作系统上搭建多个虚拟机,在每个虚拟机上部署多个APP应用
优点:
	虚拟机间资源隔离,虚拟机间互不影响,虚拟机可以做成镜像复制使用
缺点:
	资源浪费,每个虚拟机都有一个完整的系统和环境;虚拟机启动慢

容器化时代(Docker)

在这里插入图片描述

描述:
	在操作系统上搭建容器运行时环境,拉取镜像创建容器,每个容器只包含运行时所需环境
优点:
	容器打包成镜像复制使用很方便,容器间运行时环境隔离,资源节约;容器启动迅速;容易实现大量的分布式部署、扩展
缺点:
	

在这里插入图片描述

K8S简介

kubernetes简称k8s。是用于自动部署,扩展和管理容器化应用程序的开源系统。
中文官网:https://kubernetes.io/Zh/
中文社区:https://www.kubernetes.org.cn/
官方文档:https://kubernetes.io/zh/docs/home/
社区文档:https://docs.kubernetes.org.cn/

容器编排,在多个容器运行时环境里动态的上线容器、下线容器

docker swarm:只能编排docker运行时环境

K8S:K8S是部署和管理分布式环境的,是一个编排系统,用于构建一个强大、健壮、弹性和可扩展性的分布式系统
可以管理多种不同类型的容器运行时环境;

docker swarm:docker官方的编排工具,例如可以保证在docker集群中启动3个购物车容器,如果某环境宕机了,还可以动态在其他环境再启动一个

在这里插入图片描述

功能

调度

决定服务在哪个节点启动

在这里插入图片描述

自动恢复

检查节点不能响应,自动再其他节点启动

在这里插入图片描述

水平伸缩

应用负载较高时,自动再启动一个应用

在这里插入图片描述

架构

整体主从

Master+Node,每个节点包含Docker运行时环境+kubelet

在这里插入图片描述

主体结构

UI:可视化界面
CLI:命令行,通过Master暴露的API请求K8S集群,由Master调用各Node完成响应
Master:
Node:

在这里插入图片描述

Master架构
每个部分都可以搭建集群
1.API Server接收部署请求,存储到etcd中
2.scheduler监控etcd,选择节点启动新创建未运行的pod

在这里插入图片描述

在这里插入图片描述




在这里插入图片描述

在这里插入图片描述

kubectl

在这里插入图片描述

示例:

在这里插入图片描述

kubectl:命令行工具,用于发送命令行给主节点的【主节点可以接受用户界面、命令行的请求】

在这里插入图片描述

Controller
主要是定义Pod属性
Pod副本数量
Pod类型
Deployment
部署,按照Controller的定义来部署维护Pod
service
service:一组Pod,例如多个购物车Pod,访问购物车请求访问Pod,service负载决定使用哪个pod

在这里插入图片描述

在这里插入图片描述

Label

在这里插入图片描述

在这里插入图片描述

Node架构
Node:节点组件
kubelet:代理(真正干活的),保证容器运行在pod中,CSI:每个容器的挂载目录;CNI:每个容器的网络
	创建销毁pod
	pod:一个pod包含一组容器(容器理解为docker中的容器)【多个互相依赖的容器组成一个pod单位】
kube-proxy:例如管理pod的ip,相当于网卡路由器,接收请求转发,将请求负载均衡到POD上(外界通过proxy来访问)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

流程叙述

1.通过

kubectl重要命令(K8S)

指令:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

查看k8s下所有资源(pod、service、deploy、副本):kubectl get all
查看k8s下所有资源:kubectl get all -o wide


查看集群内所有节点:kubectl get nodes


查看名称空间:kubectl get ns


查看kubelet日志:journalctl -u kubelet
master监控Node各节点:watch kubectl get pod -n kube-system -o wide
查看日志:kubectl logs --namespace kubesphere-devops-system


查看所有service:kubectl get svc
查看所有service:kubectl get svc -o wide
删除service:kubectl delete service/tomcat6


查看所有名称空间的pod:kubectl get pods --all-namespaces
查看所有名称空间的pod:kubectl get pods --all-namespaces -o wide
查看默认名称空间pods:kubectl get pods
查看指定名称空间pod:kubectl get pods --namespace kube-system -o wide
查询pod详细信息:kubectl --namespace kube-system describe pod tiller-deploy-7b76b656b5-qpmb4
查看helm: kubectl get pod -n kube-system -l app=helm
查看tiller:kubectl get pods -n kube-system -owide | grep tiller-deploy
删除pod:kubectl delete pod/tomcat6


查询部署:kubectl get deployment
查询名称空间下的部署:kubectl get deployment -n kube-system
创建一个部署:kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8
暴露一个部署。service随机分配端口:kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort
获取部署的yaml:kubectl create deployment tomcat7 --image=tomcat:6.0.53-jre8 --dry-run -o yaml
应用升级:kubectl set image
设置某部署副本数,pod数:kubectl scale --replicas=3 deployment tomcat6
删除名称空间下的部署:kubectl delete deployment tiller-deploy --namespace kube-system(要删除部署,不要删除pod,否则会自动部署pod)
删除部署:kubectl delete deployment.apps/tomcat6


获取help信息(可以看到–dry-run -o yaml生成模板的提示):kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8 --help(可以看到–dry-run -o yaml生成模板的提示)
生成模板到文件tomcat6.yaml:kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8 --dry-run -o yaml > tomcat6.yaml
使用yaml完成部署:kubectl apply -f tomcat6.yaml

异常解决:
2.master执行watch kubectl get pod -n kube-system -o wide发现问题
文档:https://www.jianshu.com/p/bcc05427990d(CrashLoopBackOff)
	1)找到出问题的主机执行kubectl get pod获取pod的状态
	2)查看pod的详细信息:kubectl describe pod elkhost-944bcbcd4-8n9nj
	3)查看此pod日志:kubectl logs elkhost-944bcbcd4-8n9nj

一、安装kubernetes集群

方式一:安装minikube
方式二:k8s集群安装

方式一:简述

在这里插入图片描述

方式二:前置要求

在这里插入图片描述

1.基础环境搭建

【部署步骤】

在这里插入图片描述

1.1.vagrant创建虚拟机环境(NAT网络)

查看虚拟机网卡:

在这里插入图片描述

1.拷贝k8s文件夹到一个无空格、中文的目录下,修改配置文件Vagrantfile:node.vm.box = "centos7"
	原因:默认使用centos/7,会去仓库下载镜像(耗时很长),所以使用本地镜像centos7(在环境搭建.md里,构建了本地镜像centos7,详细请参考环境搭建.md【vagrant box add centos7 CentOS-7-x86_64-Vagrant-2004_01.VirtualBox.box】)
	
2.虚拟机默认配置下存在的问题
	1)无法使用ssh远程连接
		【修复流程】
		vagrant ssh k8s-node1
		su root   密码:vagrant
		vi /etc/ssh/sshd_config	修改PasswordAuthentication yes
		service sshd restart(或者重启:reboot)
		使用xshell工具连接,连接信息:192.168.56.100  root/vagrant
	
	2)三台虚拟机共用同一IP
		【问题描述】
		默认情况下存在以下两个网卡:
			网卡一:eth0(网络地址转换NAT,所有虚拟机共用1个IP【会导致集群环境搭建困难度】,此种网络环境是通过映射主机端口与虚拟机端口完成通讯的【同时映射多台虚拟机】)
			网卡二:eth1(仅主机Host-only网络,192.168.56.100)【方便开发,主机环境ssh连接虚拟机】
	
	--命令ip route show:查看每个虚拟机的所有网卡和默认使用的网卡(eth0)
	--命令ip addr:查看每个虚拟机的网卡以及IP(三台虚拟机eth0网卡下的IP都是10.0.2.215)
	
		【解决方案】:
		网卡1:使用NAT网络代替  网络地址转换NAT
		网卡2:维持默认,使用仅主机Host-only网络,保证宿主机与k8s虚拟机在同一局域网内192.168.56.xx(虚拟机私有网络)
		
		【具体步骤】
		1)将三台虚拟机的电源关闭
		2)在virtual box管理器上依次点击:工具=》全局设定=》网络=》添加新的NAT网络
		3)选中一台虚拟机=》设置=》网络=》网卡1=》连接方式:NAT网络=》界面名称:选择步骤2创建的NAT网络=》高级=》刷新mac地址(每台虚拟机都会新生成一个独立IP)
		4)每台虚拟机重复步骤3
		5)设置成功后记录每台虚拟机网卡1和网卡2的ip,以下是我本地的ip,供参考
			192.168.56.100=》10.0.2.4
			192.168.56.101=》10.0.2.15
			192.168.56.102=》10.0.2.5

3.配置linux环境
关闭防火墙:
	systemctl stop firewalld
	systemctl disable firewalld
关闭selinux:(默认安全策略 cat /etc/selinux/config)
	sed -i 's/enforcing/disabled/' /etc/selinux/config
	setenforce 0
关闭swap: 关闭内存交换,否则k8s性能会出现问题(cat /etc/fstab)
	swapoff -a	只是临时关闭
	sed -ri 's/.*swap.*/#&/' /etc/fstab   使用此命令永久关闭
	
4.修改主机名
	1)查看主机名,如果主机名是localhost需要修改
		--命令:hostname查看当前主机名
	2)修改主机名
		hostnamectl set-hostname k8s-node1

5.修改每个虚拟机的hosts,保证各节点间可以通过域名访问
vi /etc/hosts
10.0.2.5 k8s-node1
10.0.2.4 k8s-node2
10.0.2.15 k8s-node3

6.将桥接的IPv4流量传递到iptables的链,每个节点都执行以下命令
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system

7.备份:
在virtualBox上给三台主机做备份

疑难问题:
遇见提示是只读的文件系统,运行如下命令
mount -o remount rw /

date查看时间(可选)
yum install -y ntpdate
ntpdate time.windows.com同步最新时间



1.2.安装容器运行时环境(docker)

简述:k8s集群环境,每个节点都需要一个容器运行时环境(这里选择docker)

1、卸载旧版本【uninstall old versions】
	sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
                  
2、安装前置依赖  安装 docker-CE
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

3、设置镜像地址
	方案一: 更新yum源 让linux 知道我们docker 去哪里下载
	sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
	方案二:(推荐,阿里镜像)
	sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo【这个镜像和后面提到的镜像加速不同,这里指的是下载docker本身的镜像地址】
	
4、安装docker以及docker-cli
sudo yum install -y docker-ce docker-ce-cli containerd.io

5、虚拟机开机启动:
	sudo systemctl enable docker
启动docker
	sudo systemctl start docker


6、测试
docker images -a

7、docker配置镜像下载加速
	1)默认从hub.docker下载软件镜像【很慢】
	2)修改成aliyun的镜像加速器
	3)执行【获取第一步配置的镜像加速器网址】
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://7zi5cb9i.mirror.aliyuncs.com"]
}
EOF

sudo systemctl daemon-reload    伴随线程启动
sudo systemctl restart docker
	
8.拉取
docker pull quay.io/openebs/provisioner-localpv:1.5.0

1.3.安装kubeadmin、kubelet、kubectl

在这里插入图片描述

1.每个节点安装kubeadmin(快速构建集群环境的工具,主节点设置Master,从节点join到集群)
2.每个节点安装kubelet(真正干活的)
3.每个节点安装kubectl(命令行工具)
4.每个节点都要安装Docker(master和Node都要,容器运行时环境)
添加阿里云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
查看是否安装相关源:yum list|grep kube
1、安装
yum install -y kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3

2、开机启动kubelet,要把每一个Node注册到集群中
sudo systemctl enable kubelet
sudo systemctl start kubelet【到这一步暂时还启动不起来,使用systemctl status kubelet查看状态,后面还有要配置的】

重置集群(非必要)

如果在安装需要重新安装,且执行了以下两行语句,重新安装会失败,需要执行一些删除操作(如果没有重装的需求,跳过此步骤)
swapoff -a
kubeadm reset
	文档:https://blog.youkuaiyun.com/woay2008/article/details/93250137
-----------------------------------------------------------------------------------------
需要执行以下操作:

Master执行:
systemctl daemon-reload
systemctl restart kubelet
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X  
rm -rf $HOME/.kube

Master+Node执行:
     rm -rf /var/lib/etcd
	 rm -rf /etc/cni/net.d
	 rm -rf /var/lib/kubelet
	 rm -rf /etc/kubernetes

2.部署

2.1.部署Master

1.挑选一台主机为master(当前选择10.0.2.4作为主机),将k8s文件夹上传到master主机的root路径下(gitee上有)

2.打开k8s文件,执行可执行文件拉取镜像
	1)赋予执行权限(rwx):chmod 700 master_images.sh
	2)执行:./master_images.sh
【No such file 解决方法:https://blog.youkuaiyun.com/youzhouliu/article/details/79051516】
	3)查看镜像下载情况:docker images

3、初始化master节点上,在master上执行:
sudo kubeadm init \
--apiserver-advertise-address=10.0.2.5 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.17.3 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16

打印Your Kubernetes control-plane has initialized successfully!代表初始化成功

讲解:
	1.apiserver-advertise-address使用主节点ip(ip addr查看,需要使用默认网卡地址 eth0)
	2.默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。可以手动按照我们的执行master_images.sh先拉取镜像,地址变为registry.aliyuncs.com/google_containers也可以。
	3.pod是k8s中最小的单位(多个容器组成);service是一组pod组成对外提供服务,负载均衡
	4.cidr:无类别域间路由(Classless Inter-Domain Routing、CIDR)是一个用于给用户分配IP地址以及在互联网上有效地路由IP数据包的对IP地址进行归类的方法。【1个Node有多个service,1个service有多个pod,1个pod有多个容器】
拉取可能失败,需要下载镜像。

4.记录上一步骤执行成功提示的内容:(如果token过期,重新获取一个没有过期时间的token(默认2h过期)
kubeadm token create --print-join-command --ttl=0)
	1.配置文件
	mkdir -p $HOME/.kube
	sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
	sudo chown $(id -u):$(id -g) $HOME/.kube/config
	
	2.pod网络配置,使用Flannel,是一个可以用于 Kubernetes 的 overlay 网络提供者。
	文档:https://kubernetes.io/docs/concepts/cluster-administration/addons/

	3.从节点加入集群:
kubeadm join 10.0.2.5:6443 --token aq4gpx.qnfwvq7m5jhcke3h \
    --discovery-token-ca-cert-hash sha256:4ca443aae0a624ca26b3b6d11484d1a67526c22fcebde4deb479c68671a7183e 


5.主节点执行,生成配置文件:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

master镜像拉取:

在这里插入图片描述

初始化成功:

在这里插入图片描述

2.2.安装pod网络插件(CNI)

在这里插入图片描述

部署pod网络【只有部署了网络,Node才可以加入进来】
参照doc:https://kubernetes.io/docs/concepts/cluster-administration/addons/
使用Flannel: 是一个可以用于 Kubernetes 的 overlay 网络提供者。


执行
kubectl apply -f \
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
这个地址被墙,使用我们k8s文件夹中的yml即可,同时flannel.yml中指定的images访问不到可以去docker hub找一个

1、使用本地的flannel.yml【先拉取镜像】
	1)如果kube-flannel.yml中指定的images访问不到去docker.hub中查找并修改本地yml中的配置
		# 1、访问hub.docker.com,搜索flannel,点击from quay.io/coreos/flannel
		# 2、拷贝v0.11.0-amd64的来源jmgao1983/flannel:v0.11.0-amd64
		# 3、flannel.yml中image指定的地方,修改
	2)也可以使用quay-mirror.qiniu.com和registry.aliyuncs.com
	例如quay.io=》quay-mirror.qiniu.com  || gcr.io改为registry.aliyuncs.com
		# 下拉镜像:quay.io/coreos/flannel:v0.10.0-s390x
		  如果拉取较慢,可以改为:quay-mirror.qiniu.com/coreos/flannel:v0.10.0-s390x
		# 下拉镜像:gcr.io/google_containers/kube-proxy
		  如果拉取较慢,可以改为: registry.aliyuncs.com/google_containers/kube-proxy

2、执行,使用本地的yml规则安装pod组件(kubectl delete -f kube-flannel.yml:删除yml中配置的所有组件重新安装)
	kubectl apply -f kube-flannel.yml


3、查看名称空间
kubectl get ns

4、获取所有名称空间下的的pod(相当于docker ps)
kubectl get pods --all-namespaces -o wide
如果全部都是running就成功了,如果有不是running状态的等待一段时间,下载好镜像后就可以了

docker images|grep flannel可以查到以下镜像:
jmgao1983/flannel                                                             v0.11.0-amd64       ff281650a721        19 months ago       52.6MB


查看报错日志:
journalctl -u kubelet -f

kube-flannel.yml:

在这里插入图片描述

2.3.部署Node(将Node加入K8S集群)

1、当master是ready状态时,在k8s-node2、k8s-node3执行以下命令将其添加到master
kubeadm join 10.0.2.4:6443 --token rbbfs6.or9h6i8mgdfm1czl \
    --discovery-token-ca-cert-hash sha256:9000449fd492240244794f13aab5dbd99e939dc80650b378ebee27e9c0a7f851 

token 过期怎么办
		kubeadm token create --print-join-command
		kubeadm token create --ttl 0 --print-join-command 永不过期的
		
sudo kubeadm join 10.0.2.5:6443 --token utyczi.smgab5pgss31qwmo     --discovery-token-ca-cert-hash sha256:4ca443aae0a624ca26b3b6d11484d1a67526c22fcebde4deb479c68671a7183e

异常解决:
2.master执行watch kubectl get pod -n kube-system -o wide发现问题
文档:https://www.jianshu.com/p/bcc05427990d(CrashLoopBackOff)
	1)找到出问题的主机执行kubectl get pod获取pod的状态
	2)查看pod的详细信息:kubectl describe pod elkhost-944bcbcd4-8n9nj
	3)查看此pod日志:kubectl logs elkhost-944bcbcd4-8n9nj
	
3、master监控Node各节点
watch kubectl get pod -n kube-system -o wide
查看到node2和node3镜像下载失败
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.3
docker pull kubesphere/kube-proxy:v1.17.3
docker pull jmgao1983/flannel:v0.11.0-amd64

异常处理

k8s从节点报错:The connection to the server localhost:8080 was refused - did you specify the right host or port?

文档:https://www.cnblogs.com/wangzy-Zj/p/13958054.html

1、复制配置文件
scp root@主节点服务器地址:/etc/kubernetes/admin.conf /etc/kubernetes/

2、添加环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

3、申明环境变量
source ~/.bash_profile

4、重新查看配置
kubectl get nodes
查看报错日志:
journalctl -u kubelet -f

异常解决1:
Failed to get system container stats for "/system.slice/docker.service": failed to get cgroup stats for "/system.slice/docker.service": failed to get container info for "/system.slice/docker.service": unknown container "/system.slice/docker.service"

出现此提示是由于docker 版本与k8s的版本不兼容问题导致,解决方法如下:

在K8S配置文件 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf  添加
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd --runtime-cgroups=/systemd/system.slice --kubelet-cgroups=/systemd/system.slice"

重启即可
systemctl daemon-reload && systemctl restart kubelet
异常解决2:
由于k8s安装master一直处于NotReady状态查看日志出现 failed to find plugin “flannel” in path [/opt/cni/bin]
查看 /opt/cni/bin 缺少 flannel 

查看节点状态
kubectl get nodes

查看日志命令
journalctl -u kubelet -f

下载后通过xftp 上传到Linux /home目录解压

https://github.com/containernetworking/plugins/releases/tag/v0.8.6

解压:tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz

复制 flannel 到 /opt/cni/bin/

[root@k8s-node1 home]# cp flannel /opt/cni/bin/

3.入门操作体验

部署tomcat(容灾恢复)

1.根据镜像创建一个部署:根据tomcat镜像(带java环境的镜像)创建一个部署(名字叫tomcat6)
kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8
	解析:k8s会通过主节点调用其他节点下载镜像启动容器(1个部署对应1个pod对应1个容器)
	

Kubectl get pods -o wide可以获取到tomcat信息【Kubectl get all】
# 容灾恢复1:在k8s-node3执行docker stop tomcat6停掉该容器,kubernetes会给node3重启一个容器
# 容灾恢复2:如果k8s-node3宕机,master会找到集群中另一个节点启动pod

暴露nginx访问

2、暴露一个部署【创建service】
kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort

解释:暴露一个tomcat6的部署,容器的8080端口映射pod的80端口,然后使用NodePort的方式【service为pod的80端口随机分配一个端口提供服务】。也可以不使用--type使用--node-port=31533
192.168.56.101:31533访问tomcat6

解释:暴露一个service出去,给service随机分配一个端口。此端口映射pod:80,pod:80端口映射容器8080

使用命令查看service端口:然后通过 192.168.56.101:31533可以访问Tomcat

kubectl get svc

kubectl get svc -o wide

动态扩容(缩容)测试

3、动态扩容测试
kubectl get deployment
应用升级:kubectl set image
扩容哪个部署:kubectl scale --replicas=3 deployment tomcat6

使用 kubectl get pods -o wide 查看扩容结果
结果:在k8s-node2部署了2个pod,在k8s-node3部署了1个pod,一共3个。并且service对外暴露的接口都是31533
192.168.56.101:31533
192.168.56.102:31533 都可以访问tomcat6

注意:如果需要缩容,执行:kubectl scale --replicas=1 deployment tomcat6

扩容:

在这里插入图片描述

缩容:两台terminating

在这里插入图片描述

删除

1.删除部署:会同步删除pods,不会删除service(但service已经无用处)
	kubectl delete deployment apps/tomcat6

2.删除service:
	kubectl delete service/tomcat6

二、kubectl与yaml语法的作用

1.kubectl指令

可以通过指令创建部署、暴露端口、获取节点信息等操作

官方文档:
https://kubernetes.io/zh/docs/reference/kubectl/overview/
https://kubernetes.io/zh-cn/docs/reference/kubectl/

2.yaml语法

也可以通过yaml配置文件的形式,创建部署

在这里插入图片描述

在这里插入图片描述

之前使用kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8命令行的方式部署tomcat6,现在只需要kubectl apply -f example-controller.yaml就可以实现一次部署了

1、使用yaml的方式完成部署
	1)生成一段yaml模板到tomcat6.yaml
	获取提示:kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8 --help
	生成模板文件:kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8 --dry-run -o yaml > tomcat6.yaml
	2)使用模板文件部署
	kubectl apply -f tomcat6.yaml
	3)查看pods
	kubectl get pods,
	
2、使用yaml的方式完成暴露部署
	1)生成一段yaml模板到tomcat6_expose.yaml
	kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort --dry-run -o yaml
	kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort --dry-run -o yaml > tomcat6_expose.yaml
	2)使用该yaml完成暴露
	kubectl apply -f tomcat6_expose.yaml
	
3、使用yaml的方式创建pod
	kubectl get pod tomcat6-5f7ccf4cb9-kb5hv -o yaml > mypod.yaml
	编写yml
	apiVersion: v1
	kind: Pod
	metadata:
	  labels:
		app: tomcat6-new
	  name: tomcat6-new
	  namespace: default
	spec:
	containers:
	- image: tomcat:6.0.53-jre8
	imagePullPolicy: IfNotPresent
	name: tomcat6-new
	- image: nginx
	imagePullPolicy: IfNotPresent
	name: nginx
	
如下图,创建两个image。
	kubectl apply -f mypod.yaml
	kubectl get pods : 0/2 获取到tomcat6-new 有2个容器
	

在这里插入图片描述

三、K8S细节

1.pod、controller、service简介

Pod是Kubernetes应用程序的基本执行单元,即它是Kubernetes对象模型中创建或部署的最小和最简单的单元。Pod表示在集群上运行的进程。

controller:(POD以何种方式部署【例如有状态部署、每个节点都需要的部署】)
	ReplicationController:过时
	ReplicaSet:取代了ReplicationController,用于副本复制
	Deployments:
	StatefulSets:有状态的部署【mysql有状态部署】
	DaemonSet:每一个节点都需要启动

service:
	service是对pod的负载均衡,pod可以使用不同的端口,然后整个service提供一个单独的端口为外接提供服务。

节点组成:

在这里插入图片描述

2.pod与service的关系

在这里插入图片描述

3.service的意义

统一应用的访问入口

一般是用于暴露的

在这里插入图片描述

4.label and selector

可以给pod打标签A和B,创建两个部署,分别选中A和B

在这里插入图片描述

5.ingress(nginx)

b站349集:https://www.bilibili.com/video/BV1np4y1C7Yf?p=350

作用:service可以实现节点ip:port的方式访问应用,ingress可以做到域名的方式访问(负载均衡)【底层是一个nginx】

1)部署Ingress Controller
	DaemonSet:每个节点都部署ingress,相当于为每个节点都暴露了80、443等端口(pod是ingress-nginx)
2)创建Ingress规则:在暴露服务的时候指定ingress规则
	保证使用域名就可以访问到service
	serviceName:tomcat6
	servicePort:80(pod端口,而不是service端口)
3)在windows主机本地修改本地DNS绑定
	192.168.56.102 tomcat6.atguigu.com

在这里插入图片描述

2)创建Ingress规则

在这里插入图片描述

之前暴露service的yaml:

在这里插入图片描述

1)部署Ingress Controller

apiVersion: v1
kind: Namespace
metadata:
  name: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

---

kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-configuration
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

---
kind: ConfigMap
apiVersion: v1
metadata:
  name: tcp-services
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

---
kind: ConfigMap
apiVersion: v1
metadata:
  name: udp-services
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nginx-ingress-serviceaccount
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: nginx-ingress-clusterrole
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
rules:
  - apiGroups:
      - ""
    resources:
      - configmaps
      - endpoints
      - nodes
      - pods
      - secrets
    verbs:
      - list
      - watch
  - apiGroups:
      - ""
    resources:
      - nodes
    verbs:
      - get
  - apiGroups:
      - ""
    resources:
      - services
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - "extensions"
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - ""
    resources:
      - events
    verbs:
      - create
      - patch
  - apiGroups:
      - "extensions"
    resources:
      - ingresses/status
    verbs:
      - update

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
  name: nginx-ingress-role
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
rules:
  - apiGroups:
      - ""
    resources:
      - configmaps
      - pods
      - secrets
      - namespaces
    verbs:
      - get
  - apiGroups:
      - ""
    resources:
      - configmaps
    resourceNames:
      # Defaults to "<election-id>-<ingress-class>"
      # Here: "<ingress-controller-leader>-<nginx>"
      # This has to be adapted if you change either parameter
      # when launching the nginx-ingress-controller.
      - "ingress-controller-leader-nginx"
    verbs:
      - get
      - update
  - apiGroups:
      - ""
    resources:
      - configmaps
    verbs:
      - create
  - apiGroups:
      - ""
    resources:
      - endpoints
    verbs:
      - get

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: nginx-ingress-role-nisa-binding
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: nginx-ingress-role
subjects:
  - kind: ServiceAccount
    name: nginx-ingress-serviceaccount
    namespace: ingress-nginx

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: nginx-ingress-clusterrole-nisa-binding
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: nginx-ingress-clusterrole
subjects:
  - kind: ServiceAccount
    name: nginx-ingress-serviceaccount
    namespace: ingress-nginx

---

apiVersion: apps/v1
kind: DaemonSet 
metadata:
  name: nginx-ingress-controller
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: ingress-nginx
      app.kubernetes.io/part-of: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
      annotations:
        prometheus.io/port: "10254"
        prometheus.io/scrape: "true"
    spec:
      hostNetwork: true
      serviceAccountName: nginx-ingress-serviceaccount
      containers:
        - name: nginx-ingress-controller
          image: siriuszg/nginx-ingress-controller:0.20.0
          imagePullPolicy: IfNotPresent
          args:
            - /nginx-ingress-controller
            - --configmap=$(POD_NAMESPACE)/nginx-configuration
            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
            - --publish-service=$(POD_NAMESPACE)/ingress-nginx
            - --annotations-prefix=nginx.ingress.kubernetes.io
          securityContext:
            allowPrivilegeEscalation: true
            capabilities:
              drop:
                - ALL
              add:
                - NET_BIND_SERVICE
            # www-data -> 33
            runAsUser: 33
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          ports:
            - name: http
              containerPort: 80
            - name: https
              containerPort: 443
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 10
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 10

---
apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
spec:
  #type: NodePort
  ports:
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP
  - name: https
    port: 443
    targetPort: 443
    protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

6.网络模型

四、安装kubesphere

1.可视化界面

介绍三个可视化界面:
1.dashboard:kubernetes默认可视化界面
2.kuboard:轻量级可视化界面,集群要求不高 https://kuboard.cn/support
3.kubesphere:集群要求较高,可以打通devops链路 https://kubesphere.com.cn/

1.默认可视化工具安装:使用kubernetes-dashboard.yaml 部署(在k8s文件夹内)

在这里插入图片描述

2.暴露服务

在这里插入图片描述

3.创建授权账户

在这里插入图片描述

登录界面:

在这里插入图片描述

2.kubesphere简介

在这里插入图片描述

KubeSphere是一款面向云原生设计的开源项目,在目前主流容器调度平台 Kubernetes之上构建的分布式多租户容器管理平台,提供简单易用的操作界面以及向导式操作方式,在降低用户使用容器调度平台学习成本的同时,极大降低开发、测试、运维的日常工作的复杂度。

安装kubesphere前需要安装helm、tiller
helm:客户端(简化部署指令,kubesphere依赖此客户端,实现快速部署应用)
例如创建一个部署命令  kubectl create deployment xxx,可以直接替换为 helm install xxx

tiller:服务端

3.安装helm、tiller

文档中心:https://v2-1.docs.kubesphere.io/docs/zh-CN/installation/prerequisites/

资料:https://www.cnblogs.com/xiao987334176/p/13267339.html

helm安装被墙,处理方式:https://blog.youkuaiyun.com/qianghaohao/article/details/98851147

helm安装指南:https://zhuanlan.zhihu.com/p/77496043

helm多种安装方式:http://www.coderdocument.com/docs/helm/v2/using_helm/installing_helm.html

安装tiller指南:https://zhuanlan.zhihu.com/p/77496043

方法一:
	1)使用sh文件下载【需要翻墙】:curl -L https://git.io/get_helm.sh | bash
	2)chmod 700 get_helm.sh
	3)./get_helm.sh

方法二:
	1)下载安装包:https://github.com/helm/helm/tags
	2)解压 tar -zxvf helm-v2.16.3-linux-amd64.tar.gz
	3)mv /root/k8s/linux-amd64/helm /usr/local/bin/helm
	   mv /root/k8s/linux-amd64/tiller /usr/local/bin/tiller
	4)helm version(查看是否安装成功,helm help查看帮助)

2、创建服务账号和角色绑定
cd /root/k8s
vi helm-rbac.yaml,把下面内容加到yaml中

apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system

3、部署:kubectl apply -f helm-rbac.yaml

4、初始化tiller:
	(推荐,如果有异常,通过修改dns解决):helm init --service-account tiller --upgrade -i registry.aliyuncs.com/google_containers/tiller:v2.16.3
	
	注意:上面拉取镜像失败时,再执行下面一句,就可以了
	helm init --service-account tiller --upgrade -i gcrxio/tiller:v2.16.3 --stable-repo-url=https://mirror.azure.cn/kubernetes/charts/
 	【--tiller-image指定镜像,否则会被墙】

5、检查tiller安装是否成功【如果安装失败,参考命令集合,查看pod细节 describe】

kubectl describe pod tiller-deploy-7555cf9759-sv8rj -n kube-system
【这四个都可以查是否安装成功】
异常:


tiller
helm version
kubectl get deployment -n kube-system【看部署】
kubectl get pod -n kube-system -l app=helm【看pod】
kubectl get pods --all-namespaces【看所有pods】
修改dns:【解决docker拉取失败】
vi /etc/resolv.conf
nameserver 114.114.114.114将原来的覆盖掉
不需要重启网络,否则会将新的dns覆盖掉

也可以在centos7中永久性的修改dns,但感觉速度不是很好
cd /etc/sysconfig/network-scripts/
ls
打开设置了静态ip的网卡文件,如ifcfg-enp0s8
vi ifcfg-eth0
在PEERDNS="no"下面添加
DNS1=8.8.8.8
DNS2=114.114.114.114
【
PEERDNS="no"
DNS1=8.8.8.8
DNS2=114.114.114.114
DNS3=223.5.5.5
】

重启网络
sudo service network  restart

查看dns是否修改
cat /etc/resolv.conf

初始化成功:

在这里插入图片描述

4.安装存储类型OpenEBS(StorageClass)

kubesphere是有状态应用,依赖存储类型(StorageClass)

OpenEBS:仅仅是存储类型中的一种,他会提供PV给kubesphere的有状态应用挂载,因此,若master节点存在Taint(污点),建议在安装OpenEBS前取消Taint,待OpenEBS安装完成后再对master打上Taint
1.获取master节点信息:
	kubectl get node -o wide

2.获取master节点下的Taint(污点表示有人在调度?)
	kubectl describe node k8s-node1 | grep Taint
	
3.删除污点
	kubectl taint nodes k8s-node1 node-role.kubernetes.io/master:NoSchedule-
	
4.安装OpenEBS(http://docs.openebs.io/)
	1)创建 OpenEBS 的 namespace,OpenEBS 相关资源将创建在这个 namespace 下:
		kubectl create ns openebs
		kubectl get ns
	2)安装
		helm install --namespace openebs --name openebs stable/openebs --version 1.5.0
	
	BUG1:
	helm repo remove stable
	helm repo add stable https://kubernetes-charts.storage.googleapis.com
	helm repo update
	helm search
	然后重新安装:
	helm install --namespace openebs --name openebs stable/openebs --version 1.5.0
	
	BUG2:镜像下载失败【重新设置一下阿里云加速】
	查看部署
	kubectl get deployment -n openebs
	kubectl --namespace openebs describe pod openebs-ndm-g8mfh
	再下载image【k8s-node2、k8s-node3都下载】
	docker pull openebs/admission-server:1.5.0			
	docker pull openebs/m-apiserver:1.5.0      			
	docker pull openebs/provisioner-localpv:1.5.0		
	docker pull openebs/node-disk-manager-amd64:v0.4.5  【这个在k8s-node1(master)中下载】
	docker pull openebs/node-disk-operator-amd64:v0.4.5 
	docker pull openebs/openebs-k8s-provisioner:1.5.0	
	
	docker pull openebs/snapshot-controller:1.5.0		
	docker pull openebs/snapshot-provisioner:1.5.0		
	然后查看部署状态:【全部running,则安装成功】
	kubectl get deployment -n openebs
	watch kubectl get pods --all-namespaces -o wide【监控,如果全部ready则成功】
	
5、安装 OpenEBS 后将自动创建 4 个 StorageClass,查看创建的 StorageClass
	kubectl get sc
	
6、将 openebs-hostpath设置为 默认的 StorageClass:
	kubectl patch storageclass openebs-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

7、OpenEBS 的 LocalPV 已作为默认的存储类型创建成功。可以通过命令 kubectl get pod -n openebs来查看 OpenEBS 相关 Pod 的状态,若 Pod 的状态都是 running,则说明存储安装成功
【污点在kubesphere安装成功后加】
	kubectl taint nodes k8s-node1 node-role.kubernetes.io/master=:NoSchedule

准备成功:

在这里插入图片描述

设置默认存储类型:

在这里插入图片描述

5.最小化安装Kubesphere

中国官方安装文档:https://v2-1.docs.kubesphere.io/docs/zh-CN/installation/install-on-k8s/
github安装指南:https://github.com/kubesphere/ks-installer/blob/master/README_zh.md
2.1分支安装指南:https://github.com/kubesphere/ks-installer/blob/v2.1.0/README_zh.md
可插拔功能组件:https://github.com/kubesphere/ks-installer/blob/master/deploy/cluster-configuration.yaml

最小化安装失败:https://kubesphere.com.cn/forum/d/1262-k8s(安装OpenEBS和KubeSphere都要删掉master的污点)
使用NFS存储代替OpenEBS:https://kubesphere.com.cn/forum/d/1272-kubeadm-k8s-kubesphere-2-1-1
注:当安装了最小化安装后,可通过可插拔的方式继续安装应用
	也可以安装完整版的(鉴于自己的需求)

1.删除污点
	kubectl taint nodes k8s-node1 node-role.kubernetes.io/master:NoSchedule-

2.调整从节点内存16g、8核

3.创建kubesphere-minimal.yaml

4.安装
	kubectl apply -f kubesphere-minimal.yaml
	
5.监控安装日志
	kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
	kubectl get pods --all-namespaces

6.日志打印控制台 ip:port,即完成
	需要使用 192.168.56.100:30880/login 访问
	账号/密码:admin/P@88w0rd

7.设置污点
	kubectl taint nodes k8s-node1 node-role.kubernetes.io/master=:NoSchedule

安装成功:

在这里插入图片描述

kubesphere-minimal.yaml:

---
apiVersion: v1
kind: Namespace
metadata:
  name: kubesphere-system

---
apiVersion: v1
data:
  ks-config.yaml: |
    ---

    persistence:
      storageClass: ""

    etcd:
      monitoring: False
      endpointIps: 192.168.0.7,192.168.0.8,192.168.0.9
      port: 2379
      tlsEnable: True

    common:
      mysqlVolumeSize: 20Gi
      minioVolumeSize: 20Gi
      etcdVolumeSize: 20Gi
      openldapVolumeSize: 2Gi
      redisVolumSize: 2Gi

    metrics_server:
      enabled: False

    console:
      enableMultiLogin: False  # enable/disable multi login
      port: 30880

    monitoring:
      prometheusReplicas: 1
      prometheusMemoryRequest: 400Mi
      prometheusVolumeSize: 20Gi
      grafana:
        enabled: False

    logging:
      enabled: False
      elasticsearchMasterReplicas: 1
      elasticsearchDataReplicas: 1
      logsidecarReplicas: 2
      elasticsearchMasterVolumeSize: 4Gi
      elasticsearchDataVolumeSize: 20Gi
      logMaxAge: 7
      elkPrefix: logstash
      containersLogMountedPath: ""
      kibana:
        enabled: False

    openpitrix:
      enabled: False

    devops:
      enabled: True
      jenkinsMemoryLim: 2Gi
      jenkinsMemoryReq: 1500Mi
      jenkinsVolumeSize: 8Gi
      jenkinsJavaOpts_Xms: 512m
      jenkinsJavaOpts_Xmx: 512m
      jenkinsJavaOpts_MaxRAM: 2g
      sonarqube:
        enabled: True
        postgresqlVolumeSize: 8Gi

    servicemesh:
      enabled: False

    notification:
      enabled: True

    alerting:
      enabled: True

kind: ConfigMap
metadata:
  name: ks-installer
  namespace: kubesphere-system

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: ks-installer
  namespace: kubesphere-system

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  creationTimestamp: null
  name: ks-installer
rules:
- apiGroups:
  - ""
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - apps
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - extensions
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - batch
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - rbac.authorization.k8s.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - apiregistration.k8s.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - apiextensions.k8s.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - tenant.kubesphere.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - certificates.k8s.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - devops.kubesphere.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - monitoring.coreos.com
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - logging.kubesphere.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - jaegertracing.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - storage.k8s.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - admissionregistration.k8s.io
  resources:
  - '*'
  verbs:
  - '*'

---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: ks-installer
subjects:
- kind: ServiceAccount
  name: ks-installer
  namespace: kubesphere-system
roleRef:
  kind: ClusterRole
  name: ks-installer
  apiGroup: rbac.authorization.k8s.io

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ks-installer
  namespace: kubesphere-system
  labels:
    app: ks-install
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ks-install
  template:
    metadata:
      labels:
        app: ks-install
    spec:
      serviceAccountName: ks-installer
      containers:
      - name: installer
        image: kubesphere/ks-installer:v2.1.1
        imagePullPolicy: "Always"

6.安装可插拔的功能组件

最小化安装后安装可插拔的功能组件(根据需要安装):https://v2-1.docs.kubesphere.io/docs/zh-CN/installation/install-metrics-server/

安装后如何开启 Metrics-server 安装

    通过修改 ks-installer 的 configmap 可以选装组件,执行以下命令。

$ kubectl edit cm -n kubesphere-system ks-installer

参考如下修改 ConfigMap

···
metrics-server:
     enabled: True       

    保存退出,参考 验证可插拔功能组件的安装 ,通过查询 ks-installer 日志或 Pod 状态验证功能组件是否安装成功。


1、Metrics-Server开启HPA【监控CPU使用率 弹性伸缩】:关闭
2、logging日志系统:关闭
3、DevOps系统(Jenkins一站式部署):开启
	sonarqube:开启
4、Service Mesh微服务治理功能【熔断、限流、链路追踪】【前提是要开启日志】:关闭
5、notification告警通知系统:开启
6、alerting:开启
1.删除污点

2.修改配置部署文件,实现插拔安装:
	kubectl edit cm -n kubesphere-system ks-installer

3.编辑yaml,开启以下功能,修改结束保存退出即可
	DevOps系统(Jenkins一站式部署)
	sonarqube
	notification
	alerting

4.监控安装过程
	kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
	kubectl get pods --all-namespaces
	
6.设置污点
	kubectl taint nodes k8s-node1 node-role.kubernetes.io/master=:NoSchedule

7.kubesphere界面简介

1.企业空间:相当于1个团队一个企业空间,互相隔离
	账户会分配企业空间的权限

2.基础设施:可以查看 pod、存储类型、内存、CPU等

3.Monitoring:监控

4.服务组件:

5.提供了控制台:kubectl

在这里插入图片描述

8.建立隧道,内网穿透

这里使用nps构建内网穿透失败了,可以换其他方案,例如花生壳

作用:远程访问kubesphere控制页,流水线可以根据钩子构建项目

五、使用kubesphere

1.多租户管理_创建账号

文档:https://v2-1.docs.kubesphere.io/docs/zh-CN/quick-start/admin-quick-start/

在这里插入图片描述

什么是多租户系统?
	对集群资源作权限控制

角色和账号

内置角色描述
cluster-admin集群管理员,可以管理集群中所有的资源。
workspaces-manager集群中企业空间管理员,仅可创建、删除企业空间,维护企业空间中的成员列表。
cluster-regular集群中的普通用户,在被邀请加入企业空间之前没有任何资源操作权限。

企业空间

账号名企业空间角色职责
ws-adminworkspace-admin管理企业空间下所有的资源 (本示例用于邀请新成员加入企业空间)
project-adminworkspace-regular创建和管理项目、DevOps 工程,邀请新成员加入
project-regularworkspace-viewer将被 project-admin 邀请加入项目和 DevOps 工程, 用于创建工作负载、流水线等业务资源

在这里插入图片描述

在这里插入图片描述

具体步骤

密码:Wan123

1.创建用户管理角色:users-manager
  指派权限:账户管理、角色管理

2.创建用户管理员账户:atguigu-hr/Wan123/atguigu-hr@atguigu.com
  指派角色:users-manager

3.登录atguigu-hr
  创建账号:ws-manager,指派角色:workspaces-manager(作用:创建企业空间+分配企业空间管理员)
  	【工作空间管理员】
  创建账号:ws-admin,指派角色:cluster-regular(作用:邀请企业空间成员+分配成员权限)
  	【企业空间管理员】
  创建账号:project-admin,指派角色:cluster-regular(作用:创建项目+邀请项目成员+分配成员权限)
  	【项目管理员】
  创建账号:project-regular,指派角色:cluster-regular(作用:创建部署、密钥、存储pvc)
  	【普通项目成员】
  
4.登录ws-manager
	1)创建企业空间:gulimall-workspace
	2)指派企业空间管理员:ws-admin
	
5.登录ws-admin
	1)邀请企业成员:(ws-manager也可以邀请企业成员)
		账户:project-admin,指派角色:workspace-regular(作用:创建项目)
		账户:project-regular,指派角色:workspace-viewer(作用:查看项目)
	
6.登录project-admin
	创建项目【测试】
		测试1)创建资源型项目gulimall,并邀请project-regular为该项目的开发人员
		测试2)创建DevOps项目

2.创建Wordpress应用(普通项目)

https://v2-1.docs.kubesphere.io/docs/zh-CN/quick-start/wordpress-deployment/

简介:
	WordPress 是使用 PHP 开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的环境中架设属于自己的网站。本文以创建一个 Wordpress 应用 为例,以创建 KubeSphere 应用的形式将 Wordpress 的组件(MySQL 和 Wordpress)创建后发布至 Kubernetes 中,并在集群外访问 Wordpress 服务。

在这里插入图片描述

概念:(service之间网络互通)
	PV:实际的存储资源节点
	PVC:每个应用要申请自己的PVC(持久化存储请求),例如wordpress的前端资源文件,mysql的物理表存储
	SECRET:秘钥,将不方便暴露的数据抽取成一个秘钥,在需要使用的地方引用就可以,例如账号密码

资料:

在这里插入图片描述

在这里插入图片描述

部署步骤:
1.登录project-admin账号,创建资源型项目gulimall
  邀请project-regular成为开发者

2.登录project-regular账号
	2.1.创建 MySQL 密钥
	名称:mysql-secret
	别名:MySQL 密钥
	描述信息:MySQL 初始密码
	类型:选择 默认(Opaque)
	Data:键值对填写 MYSQL_ROOT_PASSWORD 和 123456

注意:这里的键值对的key可以随便写,只需要在配置应用组件的环境变量时,将此秘钥与应用的环境变量作正确映射即可
	
	2.2.创建 WordPress 密钥
	名称:wordpress-secret
	别名:连接 MySQL 密码
	Data 键值对填写 WORDPRESS_DB_PASSWORD 和 123456。
	
3.创建存储卷
	3.1.名称:wordpress-pvc
	别名:Wordpress 持久化存储卷
	描述信息:Wordpress PVC
	完成后点击 下一步,存储类型默认 local【openebs-hostpath】
	访问模式和存储卷容量也可以使用默认值【ReadWriteOnce、10g】,点击 下一步,直接创建即可。
	
	3.2.名称:mysql-pvc
	别名:MySQL 持久化存储卷
	描述信息:MySQL PVC
	完成后点击 下一步,存储类型默认 local【openebs-hostpath】
	访问模式和存储卷容量也可以使用默认值【ReadWriteOnce、10g】,点击 下一步,直接创建即可。
	
4.部署新应用:
	创建Wordpress应用,并同时创建两个应用组件mysql和wordpress
	应用名称:wordpress

	4.1.添加mysql组件
	名称: mysql
	组件版本:v1
	别名:MySQL 数据库
	负载类型:选择 有状态服务
	添加容器镜像,镜像填写 mysql:5.6,点击 使用默认端口
	在高级设置中确保内存限制 ≥ 1000 Mi,否则可能 MySQL 会因内存 Limit 不够而无法启动。
	环境变量,然后选择 引用配置文件或密钥,名称填写为 MYSQL_ROOT_PASSWORD,下拉框中选择密钥为 mysql-secret和 MYSQL_ROOT_PASSWORD。
	点击√
	添加存储卷:选择已有存储卷(之前创建的)、读写
	容器挂载路径:(参考docker启动命令)/var/lib/mysql
	
注意:docker启动命令,docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

	4.2.添加 WordPress 组件
	名称: wordpress
	组件版本:v1
	别名:Wordpress前端
	负载类型:默认 无状态服务
	镜像填写 wordpress:4.8-apache(应指定镜像版本号),点击 使用默认端口。
	添加两个环境变量:
		点击 引用配置文件或密钥,名称填写 WORDPRESS_DB_PASSWORD,选择在第一步创建的配置 (Secret) wordpress-secret和 WORDPRESS_DB_PASSWORD。
		点击 添加环境变量,名称填写 WORDPRESS_DB_HOST,值填写 mysql,对应的是上一步创建 MySQL 服务的名称,否则无法连接 MySQL 数据库。
	点击 添加存储卷,选择已有存储卷 wordpress-pvc,访问模式改为 读写,容器挂载路径 /var/www/html。完成后点击 √。
	
5.访问 Wordpress 服务前,查看 wordpress 服务,将外网访问设置为 NodePort。
访问:192.168.56.100:30678 或者任意集群ip:30678都可以  wanzenghui/123456

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3. DevOps工程

1.DevOps简介

在这里插入图片描述

存在两种项目,其中上面部署的Wordpress应用属于普通项目,从docker中拉取镜像直接部署应用

DevOps是自己完成从源码到部署的流程(包含推送github的tag,和推送docker hub的镜像tag),通过创建流水线的方式实现

在这里插入图片描述

什么是DevOps?
Dev :怎么开发? 怎么承担高并发
Ops:怎么运维? 怎么做到高可用

开发、运维都需要了解的内容,保证开、部署自动化,而不需要运维再部署的时候再来咨询开发如何打包

2.CICD简介(大图)

持续集成、持续交付、持续部署

在这里插入图片描述

1659249632093
持续集成(Continuous Integration)

集成:jenkins依赖maven build打包(jar),然后部署到环境上
而持续集成需要具备的条件是以下5条
	
	1、持续集成是指软件个人研发的部分向软件整体部分交付,频繁进行集成以便更快地发现其中的错误。"持续集成"源自于极限编程(XP),是XP最初的12种实践之一。
	2、CI需要具备这些:
		1)全面的自动化测试。这是实践持续集成&持续部署的基础,同时,选择合适的自动化测试工具也极其重要;
		2)灵活的基础设施。容器,虚拟机的存在让开发人员和QA人员不必再大费周折;
		3)版本控制工具。如 Git.CVS,SVN等;
		4)自动化的构建和软件发布流程的工具,如Jenkins.flow.ci;
		5)反馈机制。如构建/测试的失败,可以快速地反馈到相关负责人,以尽快解决达到一个更稳定的版本。
持续交付(Continuous Delivery)

交付:将测试通过的代码交付到 "类生产环境"

	持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。持续交付优先于整个产品生命周期的软件部署,建立在高水平自动化持续集成之上。
【灰度发布。】
持续交付和持续集成的优点非常相似:
	1、快速发布。能够应对业务需求,并更快地实现软件价值。
	2、编码->测试->上线->交付的频繁迭代周期缩短,同时获得迅速反馈;
	3、高质量的软件发布标准。整个交付过程标准化、可重复、可靠.
	4、整个交付过程进度可视化,方便团队人员了解项目成熟度;
	5、更先进的团队协作方式。从需求分析、产品的用户体验到交互设计、开发、测试、运维等角色密切协作,相比于传统的瀑布式软件团队,更少浪费。


持续部署(Continuous Deployment)

	持续部署是指当交付的代码通过评审之后,白动部署到"生产环境"中。持续部署是持续交付的最高阶段。这意味着,所有通过了一系列的自动化测试的改动都将自动部署到生产环境。它也可以被称为"Continuous Release"。
	
		“开发人员提交代码,持续集成服务器获取代码,执行单元测试,根据测
		试结果决定是否部署到预演环境,如果成功部署到预演环境,进行整体
		验收测试,如果测试通过,自动部署到产品环境,全程自动化高效运转。”
	
	【持续部署主要好处是,可以相对独立地部署新的功能,并能快速地收集真实用户的反馈。】
		"You build ityou run it,这是Amazon一年可以完成 5000万次部署,
		平均每个工程师每天部署超过50次的核心秘籍。
	

4.对外暴露SonarQube

文档:https://v2-1.docs.kubesphere.io/docs/zh-CN/devops/sonarqube/

k8s自动部署了SonarQube,需要对外暴露(新版要自己安装SonarQube)
先找到服务:kubectl get svc --all-namespaces
	http://192.168.56.100:31688/about
	登录:admin/admin
	Analyze a project:gulimall-analyze
	保留凭证gulimall-analyze: 5fe06110884cba4598249f5d7555b02c1e4ebd3c
	
mvn sonar:sonar \
  -Dsonar.host.url=http://192.168.56.100:31688 \
  -Dsonar.login=5fe06110884cba4598249f5d7555b02c1e4ebd3c

在这里插入图片描述

5.Jenkins搭建流水线

文档:https://www.jenkins.io/zh/doc/book/pipeline/

视频:https://www.bilibili.com/video/BV1np4y1C7Yf?p=361

DevOps项目,其流水线由Jenkins实现
只要项目内指定好了JenkinsFile,Jenkins就可以按照步骤来持续集成

在这里插入图片描述

1、checkout scm:从github拉取代码
2、unit test:单元测试
3、sonarqube analysis:代码审查
4、build and push snapshot:构建镜像推送到docker hub中【登录docker hub查看tag】
5、push the latest image:推送最新镜像【docker hub最新镜像被覆盖】
6、deploy to dev:手动确认是否部署到开发环境【namespace一样的项目】
7、push the tag:手动确认release,代码是否推送到github的tag上【git tag -a v0.0.2 -m v0.0.2】同时0.0.2也会推送一个镜像到docker hub上
8、deploy to production:是否部署到生产环境【namespace一样的项目】

案例:https://v2-1.docs.kubesphere.io/docs/zh-CN/quick-start/devops-online/

总结:1.创建凭证(github、docker-hu、sonar-token、demo-kubeconfig)
     2.fork项目到仓库,修改Jenkinsfile-online,保证凭证一致,删除-o;修改Jenkinsfile-online,保证凭证id正确
     3.查看项目内devops-sample-svc.yaml配置,拿到开发环境和生产环境的名称空间
     4.创建资源项目,开发环境、生产环境,名字为上一步拿到的名称空间
     5.创建流水线,选择代码仓库中fork的项目
     6.运行流水线
https://v2-1.docs.kubesphere.io/docs/zh-CN/quick-start/devops-online/
https://www.kubernetes.org.cn/5826.html
需要一个Jenkinsfile ,记录三个凭证
	DockerHub、GitHub 和 kubeconfig (kubeconfig 用于访问接入正在运行的 Kubernetes 集群)
	
1、创建凭证【四个凭证,还有之前记录的SonarQube的token】
	dockerhub-id:账户凭证【存储在self-improve里】
	github-id:账户凭证
	demo-kubeconfig:kubeconfig
	sonar-token:秘密文本,5fe06110884cba4598249f5d7555b02c1e4ebd3c【使用3.0版本自己下载sonar-qube】


2、将项目fork到自己的仓库
https://github.com/kubesphere/devops-java-sample

3、修改Jenkinsfile-online
    environment {
        DOCKER_CREDENTIAL_ID = 'dockerhub-id'
        GITHUB_CREDENTIAL_ID = 'github-id'
        KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
        REGISTRY = 'docker.io'
        DOCKERHUB_NAMESPACE = 'wanzenghui'
        GITHUB_ACCOUNT = 'wanzenghui'
        APP_NAME = 'devops-java-sample'
        SONAR_CREDENTIAL_ID = 'sonar-token'
    }

4、删除Jenkinsfile-online中maven的-o


5、找到devops-java-sample/deploy/dev/devops-sample-svc.yaml,拿到dev和prod的名称空间:kubesphere-sample-dev 和 kubesphere-sample-prod

6.登录project-admin,创建两个资源型项目,kubesphere-sample-dev、kubesphere-sample-prod,需要与名称空间保持一致,邀请成员project-regular
  创建一个DevOps工程,邀请成员project-regular
	
7、创建流水线
	1)登录project-regular,进入DevOps工程,创建一个流水线demo-cicd
	2)选择一个代码仓库github=》获取token,然后选择fork过来的的项目。下一步【token保存在self-improve】
	3)丢弃分支,使用默认值
	4)指定路径,Jenkinsfile-online
	5)设置拉取时间5min,和webhook回调【在github设置,需要配合内网穿透】
	
8、创建完毕,开始拉取项目、依赖、构建、单元测试
	流水线创建完成后会创建两个活动,因为有两个分支master+dependency
	1)此时会弹出异常,原因:拉取jar包失败
		点开活动 master,查看日志:从repo.spring.io/spring-boot-starter-parent下载失败,应该从maven仓库去下载
	2)解决bug,停止master活动
	修改代码pom.xml中spring-boot-starter-parent的版本【去spring.io查看springboot的版本2.1.13.RELEASE】
	删除<repositories>和<pluginRepositories>
	3)选择流水线,重新运行,tag_name设置v0.0.2
	
9.点击push with tag
	在github上打tag
	在dockerhub上部署版本

10.deploy to production,部署到生产环境

这两步需要手动确认:

在这里插入图片描述

github:

在这里插入图片描述

dockerhub:

在这里插入图片描述

k8s学习 — (DevOps实践)第十四章 微服务 DevOps 实战 【Kubesphere DevOps(3) 在集群管理 > 配置 > 配置字典下搜索 ks-devops-agent。点进去后点击更多操作 > 编辑 YAML 添加如下内容并保存。 阅读详情

相关推荐

kubesphere的安装与使用

写这些,仅记录自己学习使用k8s的过程。如果有什么错误的地方,还请大家批评指正。最后,希望小伙伴们都能有所收获。

????爱好者的博客 4256

KubeSphere入门到崩溃-v02

KubeSphere入门到崩溃-v02

大虾别跑 1093

AMD Ross FPGA Agent 实战:用 AI 驱动 Vivado 开发流程

在 EDA 领域,FPGA 开发长期面临工具链重、反馈周期长、报错晦涩等痛点。AI Agent 通过自然语言交互与工具调用,将 Vivado 的 Tcl 批处理流程封装为可编排、可观测的智能体,显著降低查文档与读报告的时间成本。其核心在于 Harness 与 Agent 的协同:Harness 提供安全执行环境,Agent 负责决策与迭代。典型应用包括工程创建、约束生成、综合实现报告解读及比特流失败排查。本文以 AMD Ross 为例,拆解其架构设计与实操方法,帮助开发者理解如何将 Agent 落地到高门槛

weixin_29189363的博客 1013

Kubernetes 安装 minikube

教程。

tian830937的专栏 1322

宇树机器人丝滑的二人转动作背后,MPC到底是什么?

了解MPC,让我们闻“机”起舞。

Barok的博客 2144

树莓派4B+Ubuntu22.04+思岚RPLIDAR C1激光雷达应用

树莓派+Ubuntu22.04+思岚RPLIDAR C1激光雷达简单应用

techfuture的博客 3703

Kubernetes——使用minikube搭建环境

minikube

吴声子夜歌的博客 475

【教程】ENVI主成分分析详解

主成分分析(PCA)是一种统计方法,简而言之就是用几种特性去描述事物。每个事物都可以用不同的特性去进行表达,但这些特性一般而言是存在相互的融合和冗余,而用主成分分析方法将这些特性进行转换成不相关的新特性。 在ENVI软件中共提供了三种主成分分析方式分别为:(1)Forward PCA Rotation Existing Statistics(2)Forward PCA Rotation New Statistics and Rotate(3)Inverse PCA Rotati...

YW_remote的博客 1万+

ubuntu离线安装kubesphere(包括docker、harbor)

这边使用虚拟机下载依赖配置环境以及模拟服务器各个节点,使用两个虚拟机模拟离线不联网环境的服务器,使用一个虚拟机联网下载依赖包,然后传入两个不能联网的虚拟机安装所有环境(我这边偷懒就用两个虚拟机中的一个联网下载安装包。再安装到两个虚拟机内了)。

progrmmmm的博客 3943

大模型选型实战:为OpenClaw匹配最优“大脑”的全维度考量

大模型不是越贵越好,也不是参数越高越好,适合自己的使用场景才是最好的。按照我的方法,先明确自己的需求,再选对应的模型,配置多模型自动路由,既能保证体验,又能最大限度降低成本。我自己用这套配置用了半年多,不管是写文章、写代码还是处理复杂问题,都完全够用,成本也很低,大家可以参考一下。如果不知道选什么模型,可以在评论区说一下你的使用场景。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 343

【半导体工业实战】C#.NET开发SECS/GEM协议上位机(完整可运行源码+全进制转换工具类+工业级通信封装)

在半导体这个高精尖的工业领域,SECS/GEM协议是设备通信的基石,而C#.NET凭借其稳定性、高效的字节处理能力、Windows工控机的深度适配,成为SECS上位机开发的最优选择。本文从半导体行业的专属认知出发,提供了完整的进制转换工具类、工业级的SECS通信封装、实战的报文解析与业务调用示例、半导体专属的避坑指南,所有内容均为真实项目经验的沉淀,无空洞理论、无AI冗余文字,所有源码均可直接编译运行、无缝移植到半导体项目中。半导体工控开发的核心,从来不是炫技,而是。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 896

KubeSphere 3.4 容器平台深度解析:云原生应用管理、特性架构与部署实战指南

KubeSphere 是一个以 Kubernetes 为内核的开源企业级容器平台,提供多租户容器管理、DevOps 流水线、服务网格、可观测性、应用商店与边缘计算等全栈能力。本文以 KubeSphere 官方仓库的 [README.md](https://link.gitcode.com/i/84a1f64fc0a7aa9bce5826f7749923b0) 为骨架,结合仓库源码(如 [ks-ap

gitblog_00654的博客 762

告别 GENERATE_SUBPOOL_DIR_FULL:用 RTTC 平替 CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE 的一套更稳方案

文章摘要:本文探讨了ABAP开发中动态内表的创建问题,重点分析了使用CL_ALV_TABLE_CREATE方法可能遇到的GENERATE_SUBPOOL_DIR_FULL错误。该错误源于临时subroutine pool的36次创建上限,常在批量处理或频繁调用时出现。文章提出基于RTTC技术的替代方案ZCL_ALV_TABLE_CREATE_RTTC,通过运行时类型服务直接创建动态内表,无需生成临时代码,从而规避了资源限制。该方法保持接口兼容性,只需简单替换类名即可实现无缝迁移,是解决动态表创建瓶颈的有效方

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 223

k8s学习--k8s集群部署kubesphere的详细过程

KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的分布式操作系统,完全开源,支持多云与多集群管理,提供全栈的 IT 自动化运维能力,简化企业的 DevOps 工作流。它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用 (plug-and-play) 的集成。作为全栈的多租户容器平台,KubeSphere 提供了运维友好的向导式操作界面,帮助企业快速构建一个强大和功能丰富的容器云平台。

lwxvgdv的博客 3753

Codex CLI 手机号验证失败?5 种接码平台实测对比与绕过地区限制的 3 步操作

揭示 Codex CLI 手机号验证失败的真实原因在于上下文污染而非网络问题,分析其通过 ASN、Accept-Language 和 TLS SNI 三重加权风控的机制,并实测对比 5 种接码平台在 DNS 解析路径、ASN 干净度和复用间隔上的差异,提出剥离浏览器指纹、固化 TLS SNI、隔离

weixin_42627902的博客 728

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

kubesphere+devops使用总结

提示:这里可以添加技术整体架构Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化工作负载和服务,可促进声明式配置和自动化。谷歌在 2014 年开源了 Kubernetes 项目。Kubernetes 为您提供了一个框架来弹性地运行分布式系统。它负责您的应用程序的扩展和故障转移,提供部署模式等等。

dhhg31906的博客 1627

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

59 张高清大图,带你实战入门 KubeSphere DevOps

作者:运维有术星主KubeSphere 基于的 DevOps 系统是专为 Kubernetes 中的 CI/CD 工作流设计的,它提供了一站式的解决方案,帮助开发和运维团队用非常简单的方式构建、测试和发布应用到 Kubernetes。它还具有插件管理、、代码依赖缓存、代码质量分析、流水线日志等功能。DevOps 系统为用户提供了一个自动化的环境,应用可以自动发布到同一个平台。它还兼容第三方私有镜像仓库(如 Harbor)和代码库(如 GitLab/GitHub/SVN/BitBucket)。

KubeSphere 3779

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

在 K8s 中快速部署使用 GitLab 并构建 DevOps 项目

新年伊始,“极狐(GitLab) 联合青云(QingCloud 公有云服务和 KubeSphere 容器平台)、上海云轴(ZStack Cloud 云平台和 ZStack Cube 超融合...

云原生实验室 3661

篇一:部署Kubesphere

篇一:部署Kubesphere

老白嫖大怪兽的博客 5674

基于Kubesphere容器云平台物联网云平台Devops实践

基于Kubesphere容器云平台物联网云平台Devops实践

欢迎来到风离的个人空间 1618

sealos+rook部署kubeSphere

环境初始化 准备以下节点资源: 节点名称 节点IP CPU 内存 系统盘 数据盘 存储盘 操作系统 cluster1 cluster1-k8s-master1 192.168.1.95 2核 8G vda: 60G vdb: 100G vdc:100G CentOS7.8 minimal cluster1-k8s-master2 192.168.1.96 2核 8G vda: 60G vdb: 100G vdc:100G CentOS7.8 minimal

IT 5886

终极KubeSphere容器平台:企业级Kubernetes管理完全指南

你是否还在为Kubernetes的复杂运维而烦恼?KubeSphere正是你需要的解决方案!作为一款开源的企业级容器平台,KubeSphere构建于Kubernetes之上,提供了全栈化的容器管理能力,让Kubernetes变得简单易用。无论是服务治理、DevOps、微服务管理,还是监控告警、日志查询,KubeSphere都能帮你一站式解决。今天,我就带你深入了解这个强大的平台! ## 🚀 K

gitblog_00124的博客 327

云原生技术09-Rancher vs Openshift vs KubeSphere:2026年K8s管理平台怎么选

OpenShift是红帽(Red Hat)基于Kubernetes构建的企业级容器平台。如果说原生K8s是"毛坯房",那OpenShift就是"精装修拎包入住"。│ OpenShift 架构概览 ││ │ Web控制台 │ │ oc CLI │ │ REST API │ ││ ▼ ││ │ OpenShift 核心层 │ ││ ▼ ││ │ Kubernetes 引擎层 │ ││ ▼ ││ │ 企业级功能扩展层 │ │。

weitingfu的博客 303

微服架构基础设施环境平台搭建 -(四)在Kubernetes集群基础上搭建Kubesphere平台

通过采用微服相关架构构建一套以Kubernetes+Docker为自动化运维基础平台,以微服务为服务中心,在此基础之上构建业务中台,并通过Jekins自动构建、编译、测试、发布的自动部署,形成一套完整的自动化运维、发布的快速DevOps平台。 本文是基于Kubernets集群基础上来部署Kubesphere的,搭建Kubernetes集群参见【[微服架构基础设施环境平台搭建

老杜的博客 1593

【k8s】使用containerd 2.1.5运行时离线部署k8s1.31.14+全量KubeSphere4.1.3

本文演示以Ubuntu刚装完系统离线环境下,all in one部署k8s 1.31.14+ks4.1.3(含全量组件)若有其他需要可添加我微信好友sd_zdhr。

qq_33174891的博客 799
上一篇: 13.服务链路追踪(sleuth+zipkin)
下一篇: 15.集群知识(MySQL+Redis+ElasticSearch+RabbitMQ)
onlySunKim
博客等级 码龄3年 110粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值