k8s是一个容器应用的基础运行环境,那么对于初学者来说,如何在k8s上部署自己的应用呢?本文介绍几种最简单的,适合初学者了解部署过程的几种方法:
- 通过kubectl apply直接部署
- 通过helm部署
通过kubectl apply直接部署
kubectl 直接部署容器Pod
关于如何安装kubectl,以及如果通过kubectl连接k8s的内容,本章不再赘述,这里假定大家已经安装了kubectl并能够连接k8s集群。
kubectl apply
是一种声明式的API调用方法,通过将pod的配置编写在一份yml文件中,再调用API,进行pod部署的方式,区别于docker的命令行模式,例如docker run xxx
.
声明式API调用的好处是,对于同一份yml申请,在升级过程中,不需要对旧的资源进行操作,apply命令会使得k8s自行对已有资源进行升级操作。
下面是一份部署mysql的实例:
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
# Use secret in real usage
- name: MYSQL_ROOT_PASSWORD
value: password
ports:
- containerPort: 3306
name: mysql
通过kubectl命令直接部署:kubectl apply -f mysql.yml
, 注意,如果不指定namespace,则默认pod会部署在default命名空间下。
~ kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-65c76b9ccb-5wlg2 1/1 Running 0 13m
删除pod
~ kubectl delete pod mysql-65c76b9ccb-5wlg2
pod "mysql-65c76b9ccb-5wlg2" deleted
# Deployment调度器会使得pod重复创建,如果要彻底删除资源,需要删除deployment
~ kubectl delete deployment mysql
访问pod
pod的IP地址是变化的,每次部署都会获取到新的IP地址,那么如何访问pod,在集群内部可以通过service来进行访问,service是k8s中用来代理一组pod的API对象,代理的方式是通过lable selector。
以下是访问mysql的示例:
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
clusterIP: None
spec.clusterIP: None表示这是一个无头Service,不会获取到clusterIP,则外部无法通过service访问这个pod。
~ kubectl apply -f mysql.svc.yml
~ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16d
mysql ClusterIP None <none> 3306/TCP 7m2s
测试一下集群内部的容器访问,这里启动一个临时的容器,来执行一段mysql语句
~ kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword -e 'select now()'
Warning: Using a password on the command line interface can be insecure.
+---------------------+
| now() |
+---------------------+
| 2021-06-17 02:06:48 |
+---------------------+
pod "mysql-client" deleted
以上,创建的mysql可以被通过mysql
端点进行访问了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。