首页 > 其他分享 >人人都会Kubernetes(二):使用KRM实现快速部署服务,并且通过域名发布

人人都会Kubernetes(二):使用KRM实现快速部署服务,并且通过域名发布

时间:2024-01-20 13:11:43浏览次数:24  
标签:Kubernetes Service -- KRM 域名 添加 集群 krm

1. 上节回顾

上一小节《人人都会Kubernetes(一):告别手写K8s yaml,运维效率提升500%》介绍了KRM的一些常用功能,并且使用KRM的DEMO环境,无需安装就可以很方便的生成一些资源的YAML数据并使用。

本节将实现在自己的集群中安装KRM,并且使用KRM去管理分布在各个地方的K8s集群,同时将实现快速部署一个服务到K8s集群中,最后实现对该服务的发布与访问。

2. KRM安装

KRM采用云原生设计,不依赖任何基础组件,比如数据库等。所以在安装时无需考虑数据的存储位置,只需要找一个K8s集群进行安装即可。

如果需要用KRM去管理很多个集群,需要保证安装KRM所在的集群能够与其他集群的APIServer能够通讯才可以。
接下来我们在K8s集群当中去安装KRM,本次安装参考:https://github.com/dotbalo/krm/blob/main/deploy.md。

2.1 创建基础数据

kubectl create ns krm
kubectl create sa krm-backend -n krm
kubectl create rolebinding krm-backend --clusterrole=edit --serviceaccount=krm:krm-backend --namespace=krm
kubectl create clusterrole namespace-creater --verb=create --resource=namespaces
kubectl create clusterrolebinding krm-backend-ns-creater --clusterrole=namespace-creater --serviceaccount=krm:krm-backend --namespace=krm

2.2 部署后端服务

注意:KRM部署后,默认的用户名密码是admin/admin,如果需要更改密码,请更改部署文件的USERNAME/PASSWORD变量为用户名密码的MD5值(32位大写,可以使用MD5值在线生成工具进行生成)

cat<<EOF | kubectl -n krm apply -f -
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: krm-backend
  name: krm-backend
spec:
  ports:
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: krm-backend
  sessionAffinity: None
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: krm-backend
  name: krm-backend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: krm-backend
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: krm-backend
    spec:
      serviceAccountName: krm-backend
      containers:
      - env:
        - name: TZ
          value: Asia/Shanghai
        - name: LANG
          value: C.UTF-8
        - name: GIN_MODE
          value: release
        - name: LOG_LEVEL
          value: info
        - name: USERNAME
          value: 21232F297A57A5A743894A0E4A801FC3
        - name: PASSWORD
          value: 21232F297A57A5A743894A0E4A801FC3
        - name: "IN_CLUSTER"
          value: "true"
        image: registry.cn-beijing.aliyuncs.com/dotbalo/krm-backend:latest
        lifecycle: {}
        livenessProbe:
          failureThreshold: 2
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          tcpSocket:
            port: 8080
          timeoutSeconds: 2
        name: krm-backend
        ports:
        - containerPort: 8080
          name: web
          protocol: TCP
        readinessProbe:
          failureThreshold: 2
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          tcpSocket:
            port: 8080
          timeoutSeconds: 2
        resources:
          limits:
            cpu: 1
            memory: 1024Mi
          requests:
            cpu: 200m
            memory: 256Mi
      restartPolicy: Always
EOF

2.3 部署前端服务

注意:前端服务的Service采用NodePort形式,可以直接使用节点IP+端口号即可访问,如果集群当中有Ingress Controller,可以自行配置Ingress

cat<<EOF | kubectl -n krm apply -f -
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: krm-frontend
  name: krm-frontend
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: krm-frontend
  sessionAffinity: None
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: krm-frontend
  name: krm-frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: krm-frontend
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: krm-frontend
    spec:
      containers:
      - env:
        - name: TZ
          value: Asia/Shanghai
        - name: LANG
          value: C.UTF-8
        image: registry.cn-beijing.aliyuncs.com/dotbalo/krm-frontend:latest
        lifecycle: {}
        livenessProbe:
          failureThreshold: 2
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          tcpSocket:
            port: 80
          timeoutSeconds: 2
        name: krm-backend
        ports:
        - containerPort: 80
          name: web
          protocol: TCP
        readinessProbe:
          failureThreshold: 2
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          tcpSocket:
            port: 80
          timeoutSeconds: 2
        resources:
          limits:
            cpu: 1
            memory: 512Mi
          requests:
            cpu: 100m
            memory: 256Mi
      restartPolicy: Always
EOF

2.4 访问服务

部署成功后,可以查看服务的启动状态

# kubectl get po -n krm
NAME                            READY   STATUS    RESTARTS   AGE
krm-backend-6b49f58f99-t87zn    1/1     Running   0          12m
krm-frontend-57fb848dfb-69lpm   1/1     Running   0          12m

之后查看Service的端口号

# kubectl get svc -n krm
NAME           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
krm-backend    ClusterIP   10.106.194.79    <none>        8080/TCP       13m
krm-frontend   NodePort    10.102.233.217   <none>        80:31609/TCP   13m

Pod启动成功后,可以通过任意一台Kubernetes工作节点的IP:NodePort即可访问KRM,如下图所示

默认用户名密码:admin / admin
用户名密码请在后端的USERNAME/PASSWORD变量中更改,注意更改的值为用户名密码的大写的32位MD5值

3. 集群管理

3.1 添加集群

登录后此时KRM并没有可以管理的集群,需要手动添加被管理的目标

注意添加集群的kubeconfig内容不能是只包含文件路径的kubeconfig,而是kubeconfig文件中已经有所有的证书信息
添加完成后,即可在集群列表页看到相关的集群信息,比如集群的版本、状态等

3.2 管理多个集群

如果想要添加多个集群,按照上述的方式再次添加集群即可,比如再添加一个生产环境的集群

集群添加后,可以点击KRM回到首页,之后就可以看到集群的统计信息

4. 部署服务

KRM部署完成后,就可以对集群的资源进行图形化管理操作。接下来将演示如何使用KRM快速的部署一个服务到K8s集群当中,并且进行发布和访问。

首先需要一个服务的镜像,可以使用自己公司内的镜像,也可以使用测试镜像:registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.22.1-alpine3.17

4.1 创建Deployment

在Kubernetes(k8s)中,Deployment是一种无状态控制器,通常用于无状态服务的部署,也是最常用的控制器之一。
传统手动的部署方式需要自行去编辑YAML文件,在使用KRM时,只需要点击调度资源--Deployment--创建即可,并且可以选择需要部署到哪个集群和哪个Namespace,当然了,你也可以使用KRM去创建一个新的Namespace,只需要点击集群资源--命名空间--创建按钮即可,本示例将服务部署到了default命名空间

接下里在创建页面的基本配置当中输入一个Deployment的名称,其他配置可以无需更改。
需要注意的是,通常情况下部署一个服务都需要被其他服务访问,或者被用户访问,此时需要添加一个Service才可以进行服务的暴漏,KRM提供了一键式自动添加添加的功能,只需要把自动添加Service打开即可

接下来还需要修改的地址就是镜像地址,点击容器配置,输入想要部署的镜像地址即可,其他配置按需更改

注意:如果勾选了自动添加Service,需要在容器配置--端口配置里面添加对应的端口。程序端口需要改成程序本身的真实端口号,本示例采用的是nginx服务,所以端口号是80,名称和协议按需修改和选择即可

接下来可以点击创建,就可以在K8s集群中完成部署该服务了

创建成功后,你可以自行选择下一步操作

4.2 部署状态

创建成功后,如果点击了查看列表,即可查看当前集群、当前Namespace下的资源列表

同时还可以列表页对Deployment进行一些操作,比如暂停更新、扩缩容、重启服务、回滚等,具体功能可以自行体验
另外可以点击Pod列表,查看当然Deployment管理的Pod是否已经成功运行

如果启动失败,可以在此页面进行执行命令和查看日志等操作

4.3 访问服务

如果在部署阶段没有自动添加Service,可以使用KRM进行一键添加

点击KRM的服务发布--Service--创建,然后选择发布的类型是Deployment,之后选择哪个Deployment即可,选择后会自动生成Service的相关配置及端口号配置,同时可以修改Service的类型,本次将Service改成了NodePort类型,之后点击创建即可

创建成功后,可以在Service的列表中找到该Service,并且查看该Service暴漏的端口号,之后通过节点IP和端口即可完成服务的访问

当然,如果部署的服务不需要对外暴漏,可以只需要添加Service即可,之后其他服务,或者集群内访问只需要通过http://SERVICE_NAME:SERVICE_PORT即可完成访问

5. 域名发布

如果你的集群当中已经安装并使用了Ingress Controller,那么就可以使用KRM一键式创建Ingress资源,之后就可以通过域名进行访问
接下来点击服务发布--Ingress--创建,然后选择需要代理的Service即可,如有需要可以选择多个Service

之后输入Ingress的名称及选择IngressClass

接下来配置域名和路由即可

在路由配置页面,输入自己的域名和路径即可,当然也可以添加多个域名、多个路径及配置https等,配置完成后点击创建即可
创建完成后,可以在Ingress列表中查看到该Ingress

接下来,你可以点击拓扑图即可查看到当前Ingress所有的路由树,此路由树可以以图形化的方式看到域名、Service、Pod之间的关系

最后,你就可以通过配置的域名进行服务的访问

标签:Kubernetes,Service,--,KRM,域名,添加,集群,krm
From: https://www.cnblogs.com/dukuan/p/17976346

相关文章

  • Kubernetes容器实践操作深度解析
    Kubernetes容器实践深度解析引言在当今云原生时代,容器技术已经成为构建、部署和管理应用程序的关键工具之一。而在众多的容器编排系统中,Kubernetes(简称K8s)因其强大的自动化、弹性和可扩展性而备受欢迎。本文将深入探讨Kubernetes容器实践,从基础概念到高级应用,为读者提供全面的指南......
  • rke2 offline install kubernetes v1.26.12
    文章目录1.准备2.安装ansible3.基础配置3.1配置hosts3.2安装软件包3.3内核参数3.4连接数限制3.5关闭swap、selinux、防火墙3.6时间同步4.RKE2安装4.1下载安装4.2配置其他管理节点4.3新增worker节点1.准备7台主机主机名ipcpu内存diskos角色user密码kube-mast......
  • Istio从入门到精通—— 安装 —— Kubernetes 删除 istio-system namesapce 时候,出现
    Kubernetes删除istio-systemnamesapce时候,出现Terminating解决办法当你在Kubernetes中遇到无法删除处于Terminating状态的命名空间时,可能是由于该命名空间中仍有活跃的资源或服务。要解决这个问题,你可以尝试以下几个步骤:一、常规方法检查命名空间中的活跃资源:......
  • java代码里如何判断某个IP/域名是否可达?
    在Java中,你可以使用java.net.InetAddress类来实现ping某个IP地址是否可达。下面是一个简单的示例代码:importjava.net.InetAddress;importjava.io.IOException;publicclassPingExample{publicstaticvoidmain(String[]args){StringipAddress="你的......
  • 输入自己买的域名可以访问到自己github上的网页
    需求:在腾讯云上买了一个域名,现在想通过在浏览器中输入域名,能打开自己写的网页.步骤:1、在github上面新建一个仓库,必须公开的仓库,不能是私有的,把项目代码push进去。一定要仓库下面直接是文件,不要又包一层文件夹。这里我的页面内容在是a.html里面。 这里有个问题:我本来是想,直......
  • kubernetes限制命名空间的磁盘
    kubernetes限制命名空间的磁盘只有requests没有limits,其中requests限制了请求的大小,但是限制不了实际使用的大小磁盘的requests限制apiVersion:v1kind:ResourceQuotametadata:name:namespace-quotaspec:hard:requests.storage:60Gi申请指定sc的requests......
  • Kubernetes集群中 Pod 中报pthread_create failed: Resource temporarily unavailable
    查看containerd日志显示如下信息OCIruntimeexecfailed:execfailed:unabletostartcontainerprocess:readinit-p:connectionresetbypeer:unknown"查看Pod日志中显示pthread_createfailed:Resourcetemporarilyunavailable通过监控系统查看节点的进程数t......
  • Kubernetes之云原生相关
    什么是云原生可以简单看做就是K8S。将项目全部都通过K8S部署。实际上,云原生是一条最佳路径或者最佳实践。更详细的说,云原生为用户指定了一条低心智负担的、敏捷的、能够以可扩展、可复制的方式最大化地利用云的能力、发挥云的价值的最佳路径。因此,云原生其实是一套指导进行软件......
  • Nginx转发解析长域名多路径域名
    Nginx解析短域名,例如:访问http://192.168.1.23可直接跳转到http://192.168.1.23/webroot/decisionserver{listen90;server_namelocalhost;#匹配/转到/webroot/decision上;#^(.*)$表示/后任意部分,除非和其他location匹配否则一律转向/webroot/decisio......
  • k8s(Kubernetes)一种用于自动部署、扩展和管理容器化应用程序的开源平台
    K8s全称为Kubernetes,是一种用于自动部署、扩展和管理容器化应用程序的开源平台。作为云原生技术的核心组件之一,其提供了大量灵活的Kubernetes教程,帮助开发人员和运维团队轻松地构建、交付和扩展应用程序,从而更好地应对不断增长的云端需求。K8s的核心是一个主节点,它负责管理和协调......