Rumah  >  Artikel  >  Java  >  Bagaimana untuk menggunakan projek java ke k8s

Bagaimana untuk menggunakan projek java ke k8s

WBOY
WBOYke hadapan
2023-05-15 18:07:064049semak imbas

    Kata Pengantar

    Projek Java memerlukan pemasangan dan penggunaan pelbagai persekitaran semasa proses pembangunan dan penyahpepijatan Sebelum ini, kami menggunakan penggunaan mesin maya digunakan secara automatik dengan melaksanakan arahan atau mengkonfigurasi Jekins脚本 pada mesin. Walau bagaimanapun, pemasangan dan penggunaan projek dengan ketersediaan tinggi dalam persekitaran kontena memerlukan penggunaan teknologi kontena dan k8s penjadualan dan pelaksanaan.

    Secara amnya dalam persekitaran formal, kami akan mempunyai bahagian berikut untuk membentuk penggunaan kontena:

    • Persekitaran kontena

      • docker

      • Containerd

    • k8s cluster

    • pengurusan k8s sistem

      • KubeSohere

      • papan pemuka (sistem pengurusan k8s sendiri)

    • Gudang cermin

      • Hab docker

      • pendaftaran

      • pelabuhan

    • Repositori kod

      • github

      • gitlab

    • Platform Penerbitan

      • Jekins

      • Devops

    • Muat

      • F5

      • nginx

      • Masuk

    Walau bagaimanapun, set sumber lengkap sedemikian agak besar, yang tidak sesuai untuk pemasangan dan pembelajaran peribadi. Oleh itu, artikel ini akan memperkenalkan cara menggunakan k8s集群 ke dalam persekitaran kontena dalam persekitaran yang hanya terdapat java项目.

    1. Jana projek Demo

    Jana projek Demo java, mulakan ujian pada mesin ini dan akses halaman web, seperti yang ditunjukkan di bawah

    Bagaimana untuk menggunakan projek java ke k8s

    Struktur direktori

    Bagaimana untuk menggunakan projek java ke k8s

    2 Konfigurasikan persekitaran Docker

    2.1 Tulis Fail Docker

    dalam rajah struktur direktori di atas Terdapat a file文件夹 dalam Dockerfile文件, kodnya adalah seperti berikut

    #基础镜像 java打包需要依赖jdk
    FROM java:8
    #将虚拟机的war包,cp到docker容器内部
    COPY demo-0.0.1-SNAPSHOT.jar demo-0.0.1-SNAPSHOT.jar
    #容器开放的端口
    EXPOSE 8081
    #指定docker容器时区
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Beijing' >/etc/timezone
    # 脚本启动
    ENTRYPOINT ["sh","-c","java -server -Dfile.encoding=utf-8 -Xms1024m -Xms1536m -jar -Dserver.port=8081  -Dspring.profiles.active=prod demo-0.0.1-SNAPSHOT.jar"]

    Jika projek disediakan untuk persekitaran yang berbeza, sila ubah suai ENTRYPOINT dalam parameter -Dspring.profiles.active=prod untuk mengubah suainya

    2.2 Imej pembungkusan

    Selepas mengkonfigurasi fail Dockerfile, anda perlu membungkus imej ke dalam kelompok kontena Memandangkan tiada gudang imej, pembungkusan kami perlu dibungkus dalam semua nod kontena. semasa proses penjadualan, jika nod yang tidak mempunyai imej berpakej dijadualkan, ia akan ditarik Jika imej tidak dapat diperoleh, permulaan akan gagal seperti yang ditunjukkan di bawah.

    Bagaimana untuk menggunakan projek java ke k8s

    Bagaimana untuk menggunakan projek java ke k8s

    Muat naik demo项目 yang disediakan jar包 dan Dockerfile文件 ke semua nod kelompok kontena, dan kemudian laksanakan yang berikut Perintah:

    docker image build -t an/demo_server:v1.0.0 .

    an/demo_server ialah nama imej kontena yang akan dibungkuskan konfigurasi kami di bawah k8s juga menggunakan nama ini untuk mencari imej untuk penjadualan.

    Gunakan perintah docker images untuk menyemak sama ada imej itu wujud

    Bagaimana untuk menggunakan projek java ke k8s

    3. Konfigurasikan k8s

    3.1 Tulis fail deploy.yaml

    Fail ini untuk k8s调度 Ia mengandungi 实例数量, 版本, 端口号, 对外端口号, 对外协议, dsb. yang perlu dijadualkan seperti berikut 🎜>

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: demo-server
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: demo-server
      template:
        metadata:
          labels:
            app: demo-server
        spec:
          containers:
            - name: demo-server
              image: an/demo_server:v1.0.0
              ports:
                - containerPort: 8081
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: demo-server
    spec:
      selector:
        app: demo-server
      ports:
        - protocol: TCP
          port: 8081
          targetPort: 8081
          nodePort: 31001
      type: NodePort

    mewakili bilangan bekas berjadual, yang pada masa ini adalah 1 contoh replicas参数
    mewakili nombor port yang dipetakan secara luaran >Direktori bawah ialah Sila rujuk penjelasan terperinci tentang parameter Berikut ialah penjelasan ringkasnodePort

    3.2 Mulakan penjadualan

    Muat naik fail ke nod induk k8s dan laksanakan yang berikut. arahan untuk penjadualan
    kubectl apply -f deploy.yaml

    4 . Pengesahan

    4.1 Lihat pod

    Mula-mula laksanakan arahan:

    kubectl get all或kubectl get node

    Seperti yang ditunjukkan di bawah, pelayan demo kami telah bermula, tetapi bagaimana untuk mengaksesnya telah menjadi masalah

    4.2 Mengakses sistem

    Bagaimana untuk menggunakan projek java ke k8s4.2.1 Akses dari luar kelompok

    Apabila tiada beban untuk akses luaran daripada kluster, anda perlu menyemak nod yang anda miliki

    dahulu Pada sistem, semak peruntukan kumpulan kontena dalam sistem visualisasi

    容器分配

    Dalam sistem, kita dapat melihat bahawa k8s telah menjadualkan sistem ini kepada nod2 nod, menggunakan nod2 nod ip + port, dan kami mengkonfigurasinya secara luaran Port yang dipetakan ialah 31001, dan alamat akses ialah:

    . Jika anda mengakses gambar berikut, pengesahan berjaya Bagaimana untuk menggunakan projek java ke k8s

    Bagaimana untuk menggunakan projek java ke k8s

    4.2.2 集群内部访问

    如果在集群内部访问有两种方式

    通过CLUSTER-IP:port访问
    使用命令kubectl get all可以查看到service的CLUSTER-IP

    Bagaimana untuk menggunakan projek java ke k8s

    通过pod Ip:port访问
    使用命令:kubectl get pods得到podname

    Bagaimana untuk menggunakan projek java ke k8s

    再使用命令:kubectl describe pod demo-server-8b47bd6b6-8bh6q查看pod详情里的pod IP

    Bagaimana untuk menggunakan projek java ke k8s

    5. k8s配置文件参数详解

    apiVersion: v1 # 【必须】版本号
    kind: Pod # 【必选】Pod
    metadata: # 【必选-Object】元数据
    name: String # 【必选】 Pod的名称
    namespace: String # 【必选】 Pod所属的命名空间
    labels: # 【List】 自定义标签列表
    	- name: String
    annotations: # 【List】 自定义注解列表
    	- name: String
    spec: # 【必选-Object】 Pod中容器的详细定义
    containers: # 【必选-List】 Pod中容器的详细定义
    	- name: String # 【必选】 容器的名称
    	image: String # 【必选】 容器的镜像名称
    	imagePullPolicy: [Always | Never | IfNotPresent] # 【String】 每次都尝试重新拉取镜像 | 仅使用本地镜像 | 如果本地有镜像则使用,没有则拉取
    	command: [String] # 【List】 容器的启动命令列表,如果不指定,则使用镜像打包时使用的启动命令
    	args: [String] # 【List】 容器的启动命令参数列表
    	workingDir: String # 容器的工作目录
    	volumeMounts: # 【List】 挂载到容器内部的存储卷配置
    		- name: String # 引用Pod定义的共享存储卷的名称,需使用volumes[]部分定义的共享存储卷名称
    		mountPath: Sting # 存储卷在容器内mount的绝对路径,应少于512个字符
    		readOnly: Boolean # 是否为只读模式,默认为读写模式
    	ports: # 【List】 容器需要暴露的端口号列表
    		- name: String  # 端口的名称
    		containerPort: Int # 容器需要监听的端口号
    		hostPort: Int # 容器所在主机需要监听的端口号,默认与containerPort相同。设置hostPort时,同一台宿主机将无法启动该容器的第二份副本
    		protocol: String # 端口协议,支持TCP和UDP,默认值为TCP
    	env: # 【List】 容器运行前需设置的环境变量列表
    		- name: String # 环境变量的名称
    		value: String # 环境变量的值
    	resources: # 【Object】 资源限制和资源请求的设置
    		limits: # 【Object】 资源限制的设置
    		cpu: String # CPU限制,单位为core数,将用于docker run --cpu-shares参数
    		memory: String # 内存限制,单位可以为MB,GB等,将用于docker run --memory参数
    		requests: # 【Object】 资源限制的设置
    		cpu: String # cpu请求,单位为core数,容器启动的初始可用数量
    		memory: String # 内存请求,单位可以为MB,GB等,容器启动的初始可用数量
    	livenessProbe: # 【Object】 对Pod内各容器健康检查的设置,当探测无响应几次之后,系统将自动重启该容器。可以设置的方法包括:exec、httpGet和tcpSocket。对一个容器只需要设置一种健康检查的方法
    		exec: # 【Object】 对Pod内各容器健康检查的设置,exec方式
    		command: [String] # exec方式需要指定的命令或者脚本
    		httpGet: # 【Object】 对Pod内各容器健康检查的设置,HTTGet方式。需要指定path、port
    		path: String
    		port: Number
    		host: String
    		scheme: String
    		httpHeaders:
    			- name: String
    			value: String
    		tcpSocket: # 【Object】 对Pod内各容器健康检查的设置,tcpSocket方式
    		port: Number
    		initialDelaySeconds: Number # 容器启动完成后首次探测的时间,单位为s
    		timeoutSeconds: Number  # 对容器健康检查的探测等待响应的超时时间设置,单位为s,默认值为1s。若超过该超时时间设置,则将认为该容器不健康,会重启该容器。
    		periodSeconds: Number # 对容器健康检查的定期探测时间设置,单位为s,默认10s探测一次
    		successThreshold: 0
    		failureThreshold: 0
    	securityContext:
    		privileged: Boolean
    restartPolicy: [Always | Never | OnFailure] # Pod的重启策略 一旦终止运行,都将重启 | 终止后kubelet将报告给master,不会重启 | 只有Pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常终止(退出码为0),则不会重启。
    nodeSelector: object # 设置Node的Label,以key:value格式指定,Pod将被调度到具有这些Label的Node上
    imagePullSecrets: # 【Object】 pull镜像时使用的Secret名称,以name:secretkey格式指定
    	- name: String
    hostNetwork: Boolean # 是否使用主机网络模式,默认值为false。设置为true表示容器使用宿主机网络,不再使用docker网桥,该Pod将无法在同一台宿主机上启动第二个副本
    volumes: # 【List】 在该Pod上定义的共享存储卷列表
    	- name: String # 共享存储卷的名称,volume的类型有很多emptyDir,hostPath,secret,nfs,glusterfs,cephfs,configMap
    	emptyDir: {} # 【Object】 类型为emptyDir的存储卷,表示与Pod同生命周期的一个临时目录,其值为一个空对象:emptyDir: {}
    	hostPath: # 【Object】 类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
    		path: String # Pod所在主机的目录,将被用于容器中mount的目录
    	secret: # 【Object】类型为secret的存储卷,表示挂载集群预定义的secret对象到容器内部
    		secretName: String
    		items:
    		- key: String
    			path: String
    	configMap: # 【Object】 类型为configMap的存储卷,表示挂载集群预定义的configMap对象到容器内部
    		name: String
    		items:
    		- key: String
    			path: String

    Atas ialah kandungan terperinci Bagaimana untuk menggunakan projek java ke k8s. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam