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端点进行访问了。


行愚
13 声望2 粉丝