云原生Kubernetes技术之部署服务

举报
人工智能-张晨光 发表于 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 定义数据库的环境变量,有 DATABASE、USER、PASSWORD、ROOT_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

现在 MySQL,WordPress 都已经部署成功了,第三步就是部署 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个月内不可修改。