云原生Kubernetes技术之部署服务

举报
tea_year 发表于 2024/11/24 21:50:12 2024/11/24
【摘要】 11-实战二   部署 MySQL先要用 ConfigMap 定义数据库的环境变量,有 DATABASE、USER、PASSWORD、ROOT_PASSWORD:YAMLapiVersion: v1kind: ConfigMapmetadata:  name: mysql-cm data:  DATABASE: 'db_wordpress'  USER: 'wordpress'  PASSW...

11-实战二 

 

 部署 MySQL

先要用 ConfigMap 定义数据库的环境变量,有 DATABASEUSERPASSWORDROOT_PASSWORD

YAML
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-cm
data:
  DATABASE: 'db_wordpress'
  USER: 'wordpress'
  PASSWORD: '123456'
  ROOT_PASSWORD: '123456'

接下来,我们需要把 MySQL Pod 改成 Deployment 的方式,replicas 设置成 1 个,template 里面的 Pod 部分没有任何变化,还是要用 envFrom把配置信息以环境变量的形式注入 Pod

 

YAML
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wp-mysql
  labels:
    app: wordpress
    role: database
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wp-mysql
  template:
    metadata:
      labels:
        app: wp-mysql
    spec:
      containers:
      - name: wp-mysql
        image: mysql:5.7
        imagePullPolicy: IfNotPresent
        resources:
          limits:
            cpu: 1
            memory: 2048Mi
          requests:
            cpu: 500m
            memory: 500Mi
        startupProbe:  # 容器启动
          periodSeconds: 15
          tcpSocket:
            port: 3306
        livenessProbe:   # 存活
          periodSeconds: 10
          tcpSocket:
            port: 3306
        readinessProbe:  # 就绪
          periodSeconds: 15
          tcpSocket:
            port: 3306
        ports:
        - containerPort: 3306
        envFrom:
        - prefix: 'MYSQL_'
          configMapRef:
            name: mysql-cm

我们还需要再为 MySQL 定义一个 Service 对象,映射端口 3306,让其他应用不再关心 IP 地址,直接用 Service 对象的名字来访问数据库服务:

YAML
apiVersion: v1
kind: Service
metadata:
  name: wp-mysql-svc
  labels:
spec:
  selector:
    app: wp-mysql
  ports:
  - port: 3306
    targetPort: 3306
    protocol: TCP

 

因为这三个对象都是数据库相关的,所以可以在一个 YAML 文件里书写,对象之间用 --- 分开,这样用 kubectl apply 就可以一次性创建好:

Bash
[root@node-01 11-wordpress-deploy]# kubectl apply -f mysql-dep.yaml
configmap/mysql-cm created
deployment.apps/wp-mysql created
service/wp-mysql-svc created

执行命令后,你可以用 kubectl get 查看对象是否创建成功,是否正常运行: 

部署 WordPress

因为刚才创建了 MySQL Service,所以在写 ConfigMap 配置的时候“HOST”就不应该是 IP 地址了,而应该是 DNS 域名,也就是 Service 的名字 wp-mysql-svc,这点需要特别注意:

Bash
apiVersion: v1
kind: ConfigMap
metadata:
  name: wp-cm
data:
  HOST: 'wp-mysql-svc'
  USER: 'wordpress'
  PASSWORD: '123456'
  NAME: 'db_wordpress'

 

WordPress Deployment 写法和 MySQL 也是一样的,给 Pod 套一个 Deployment 外壳replicas 设置成 2 个,用字段“envFrom”配置环境变量:

YAML
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wp-dep
  labels:
    app: wp-dep
spec:
  replicas: 2
  minReadySeconds: 30
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: wp-dep
  template:
    metadata:
      labels:
        app: wp-dep
    spec:
      containers:
      - name: wordpress
        image: wordpress:6
        imagePullPolicy: IfNotPresent
        resources:
          limits:
            cpu: 1
            memory: 1024Mi
          requests:
            cpu: 100m
            memory: 100Mi
        startupProbe:
          periodSeconds: 5
          tcpSocket:
            port: 80
        livenessProbe:
          periodSeconds: 10
          tcpSocket:
            port: 80
        readinessProbe:
          periodSeconds: 15
          tcpSocket:
            port: 80
        ports:
        - containerPort: 80
        envFrom:
        - prefix: 'WORDPRESS_DB_'
          configMapRef:
            name: wp-cm

接下来为 WordPress 创建 Service 对象,这里使用了“NodePort”类型,并且手工指定了端口号“30080”(必须在 30000~32767 之间):

 

YAML
apiVersion: v1
kind: Service
metadata:
  name: wp-dep-svc
  labels:
spec:
  selector:
    app: wp-dep
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    nodePort: 30080
    name: http

 

现在我们用 kubectl apply 部署 WordPress

 

因为 WordPress Service 对象是 NodePort 类型的,我们可以在集群的每个节点上访问 WordPress 服务。

 

 

部署 Ingress Controller

现在 MySQLWordPress 都已经部署成功了,第三步就是部署 Nginx Ingress Controller

使用 ingress 课上部署的 nginx ingress controller

YAML
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: wp-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: wp.xinxianghf.cloud
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: wp-dep-svc
            port:
              number: 80

 

 

 

ingress-nginx-controller deployment 添加  hostNetwork: true  属性,可以让 Pod 能够使用宿主机的网络。

YAML
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
。。。
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  minReadySeconds: 0
  revisionHistoryLimit: 10
  selector:
    matchLabels:
。。。
  template:
    metadata:
      labels:
。。。
    spec:
      hostNetwork: true   # Pod 使用宿主机网络
      containers:

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。