目前云原生在大厂已经有了充分的实践,也逐渐向小厂以及非互联网公司推广。适逢12月20日,腾讯云原生【燎原社】精心打造了云原生在线技术工坊,让零基础的同学也能快速入门和实践 Docker 和 Kubernetes 技术。
云原生技术工坊 通过六天的学习,让零基础的小白能够对云原生,特别是对如何基于 Kubernetes 部署应用,有一个初步的了解。在每天1-2小时的动手学习之后,还可以参与打卡,对所学进行记录和输出,学习氛围十足。本次学习的内容主要有以下几点:
前三天主要是 Docker 相关内容的学习,后三天就对本地以及腾讯云 EKS 的 Kubernetes 使用进行实践了。
这里要感谢一下 @李东bbsky 在交流群中的耐心指导。
而在六天学习的最后,有一个大作业:就是在 EKS 上使用 kubectl 和 YAML 配置文件,通过创建 Deployment 负载、存储、服务等在Kubernetes 集群上部署一个 Wordpress(含 MySQL 数据库)应用。
而本文的主要内容也是记录一下完成这个大作业的主要思路以及实践过程。
部署方案分析(如下图所示):
那么在使用 kubectl 创建资源前,我们需要先准备好以下内容:
这里我们要使用编写 YAML 配置文件的方式来部署应用。因此需要在本机或者云服务器安装好 kubectl,用于管理 k8s 集群。
在 EKS 集群实例的控制台,【基本信息】——【集群APIServer信息】开启外网访问并设置白名单(本地是互联网出口地址/云服务器是其公网 IP 地址),点击【证书管理】,下载集群的访问凭证,用于配置 kubectl。
[lighthouse@VM-4-3-centos eks-wp]$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* cls-1incp0y9-xxxxxxxxxxxx-context-default cls-1incp0y9 xxxxxxxxxxxx
随后依次创建 PV 和 PVC 存储,用于持久化 wordpress 应用的数据,创建 Deployment、Service 对象即可部署完成。
在 wp-pv.yaml 中,wp-pv 为 PV 对象名 ,server 为上面创建 CFS 的内网 IP 地址,path 为根目录 / 即可。
# wp-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: wp-pv
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
mountOptions:
- hard
- nfsvers=4
nfs:
path: /
server: x.x.x.x
随后通过 kubectl 创建 PV 对象。也可以在所有的 YAML 文件编写完成后一起执行。
[lighthouse@VM-4-3-centos eks-wp]$ kubectl apply -f wp-pv.yaml
persistentvolume/wp-pv created
[lighthouse@VM-4-3-centos eks-wp]$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
wp-pv 10Gi RWX Retain Available 2s
在 wp-pvc.yaml 中,wp-pvc 为 PVC 对象名 ,namespace 指定 PVC 所在的命名空间。
# wp-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pvc
namespace: ns-wp
spec:
accessModes:
- ReadWriteMany
volumeMode: Filesystem
storageClassName: ""
resources:
requests:
storage: 10Gi
通过 kubectl 创建 PVC 对象完成后,将自动绑定到上面的 PV 对象。
[lighthouse@VM-4-3-centos eks-wp]$ kubectl apply -f wp-pvc.yaml
persistentvolumeclaim/wp-pvc created
[lighthouse@VM-4-3-centos eks-wp]$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
wp-pv 10Gi RWX Retain Bound ns-wp/wp-pv 13m
[lighthouse@VM-4-3-centos eks-wp]$ kubectl get pvc --namespace ns-wp
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
wp-pvc Bound wp-pv 10Gi RWX 4m41s
在 wp-deployment.yaml 中,wp-deployment 为工作负载的对象名 ,namespace 指定对象所在的命名空间。设置 k8s-app: tke-wp 的标签。Pod 副本数设置为 3,wordpress 镜像从 Docker 官网拉取,暴露端口 80,目录 /var/www/html 映射 wp-data 的数据卷。
设置环境变量 WORDPRESS_DB_HOST 为上面云原生数据库的内网IP地址,WORDPRESS_DB_USER 为 root,WORDPRESS_DB_PASSWORD 从名为 wordpress-mysql 的 secret 对象获取。
而名为 wp-data 的数据卷,需要绑定之前设置的名为 wp-pvc 的 PVC 对象。
# wp-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wp-deployment
namespace: ns-wp
labels:
k8s-app: tke-wp
qcloud-app: tke-wp
spec:
selector:
matchLabels:
k8s-app: tke-wp
qcloud-app: tke-wp
replicas: 3
template:
metadata:
labels:
k8s-app: tke-wp
qcloud-app: tke-wp
spec:
containers:
- name: wordpress
image: wordpress
ports:
- containerPort: 80
volumeMounts:
- mountPath: "/var/www/html"
name: wp-data
env:
- name: WORDPRESS_DB_HOST
value: x.x.x.x:3306
- name: WORDPRESS_DB_USER
value: root
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: wordpress-mysql
key: WORDPRESS_DB_PASSWORD
- name: WORDPRESS_DB_NAME
value: wordpress
volumes:
- name: wp-data
persistentVolumeClaim:
claimName: wp-pvc
通过 kubectl 创建 Deployment 对象后,Kubernetes 将创建 3 个 Pod 副本,每个 Pod 中包含一个 wordpress 容器,每个容器都将访问同一个数据库,以及同一个 NFS 文件存储。此时,我们还无法通过公网地址访问应用。
[lighthouse@VM-4-3-centos eks-wp]$ kubectl apply -f wp-deployment.yaml
deployment.apps/wp-deployment created
[lighthouse@VM-4-3-centos eks-wp]$ kubectl get deployment --namespace ns-wp
NAME READY UP-TO-DATE AVAILABLE AGE
wp-deployment 3/3 3 3 30s
[lighthouse@VM-4-3-centos eks-wp]$ kubectl get pod --namespace ns-wp
NAME READY STATUS RESTARTS AGE
wp-deployment-78c8658fd5-cqrhk 1/1 Running 0 38s
wp-deployment-78c8658fd5-g2vcb 1/1 Running 0 38s
wp-deployment-78c8658fd5-qgfbt 1/1 Running 0 38s
在 wp-service.yaml 中,wp-clb 为 Service 的对象名 ,namespace 指定对象所在的命名空间。使用 LoadBalancer 来满足公网访问的需求,端口映射配置为 TCP 80 到 80 端口。最后通过 k8s-app: tke-wp 绑定前面已创建好的 deployment 对象。
# wp-service.yaml
piVersion: v1
kind: Service
metadata:
name: wp-clb
namespace: ns-wp
spec:
ports:
- name: tcp-80-80
port: 80
protocol: TCP
targetPort: 80
selector:
k8s-app: tke-wp
qcloud-app: tke-wp
type: LoadBalancer
通过 kubectl 创建 Service 对象后,可以查看 LoadBalancer 提供的公网访问地址。
[lighthouse@VM-4-3-centos eks-wp]$ kubectl apply -f wp-service.yaml
service/wp-clb created
[lighthouse@VM-4-3-centos eks-wp]$ kubectl get service --namespace ns-wp
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wp-clb LoadBalancer 192.168.3.87 <pending> 80:31955/TCP 3s
[lighthouse@VM-4-3-centos eks-wp]$ kubectl get service --namespace ns-wp
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wp-clb LoadBalancer 192.168.3.87 xx.xx.xx.xxx 80:31955/TCP 29s
通过浏览器访问公网地址即可访问到 wordpress 应用了。
一些需要注意的点:
后续可做的几点优化:
如果你对云原生繁多的概念困惑不已,或者苦于不知如何对云原生入门实践,那么强烈推荐一下 云原生技术工坊
笔者在云原生领域的经验尚少,文章如有纰漏,还请指点更正。
—END—
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。