multipass的基本使用---multipass安装 k3s(安装nginx,mysql,redis)

512 阅读5分钟

目录

  1. 如何安装k3s
  2. k3s 安装 nginx
  3. k3s 安装 mysql
  4. k3s 安装 redis

前言

在安装完成 multipass 虚拟机的基础上,介绍安装 k3s 以及一些常用环境的搭建

1. 如何安装 k3s

1. 创建三个虚拟机实例

# 创建集群三个实例
multipass launch --name master  -c 2 --mem 2G --disk 40G 18.04
multipass launch --name worker1 -c 1 --mem 2G --disk 40G 18.04
multipass launch --name worker2 -c 1 --mem 2G --disk 40G 18.04

2. 初始化master节点

安装k3s到master 实例中

multipass exec master -- /bin/bash -c "curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -"

获取安装k3s后的token 用于进行集群的关联

multipass exec master -- /bin/bash -c "sudo cat /var/lib/rancher/k3s/server/node-token"

3. 初始化worker节点

获取master节点的ip地址

multipass ls|grep master
# 或者
multipass info master| grep IPv4

进行worker 节点的初始化

根据前面获取到的信息进行脚本初始化

# 设置变量
K3S_URL="https://192.168.64.xxx:6443"
K3S_TOKEN="xxxx::server:xxx"
K3S_INSTALL_URL="https://rancher-mirror.rancher.cn/k3s/k3s-install.sh "
# 安装worker1
multipass exec worker1 -- /bin/bash -c "curl -sfL ${K3S_INSTALL_URL} | INSTALL_K3S_MIRROR=cn K3S_URL=${K3S_URL} K3S_TOKEN=${K3S_TOKEN} sh -"
# 安装worker2
multipass exec worker2 -- /bin/bash -c "curl -sfL ${K3S_INSTALL_URL} | INSTALL_K3S_MIRROR=cn K3S_URL=${K3S_URL} K3S_TOKEN=${K3S_TOKEN} sh -"

验证worker节点安装情况

multipass exec worker1  -- /bin/bash -c  "systemctl status k3s-agent"

image.png

2. k3s 安装 nginx

1. 初始化master中k3s 的部分环境

建立自己的 namespace 命名空间

  1. 进入到 master 实例
multipass shell master
  1. 进入到 root 权限
sudo su
  1. 创建自己的命名空间

我创建的命名空间是 test,后面的yaml 文件也是以这个命名空间为基础去创建的

kubectl create namespace test
  1. 设置默认命名空间

默认命名空间可以帮助我们去更简单的使用 kubectl 命令,否则每次命令需要指定命名空间

kubectl config set-context default --namespace=test

2. 构建nginx的部署 yaml 文件

  • nginx_pod.yml
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: nginx-deployment
  namespace: test
spec:
  selector:
    matchLabels:
      app: demo-pod
  replicas: 1
  template:
    metadata:
      labels:
        app: demo-pod
    spec:
      containers:
      - name: demo-container
        image: nginx:latest  #本地私有镜像库的镜像名称+版本
        ports:
        - containerPort: 8800
          hostPort: 8800
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: test
  labels:
    app: demo-service
spec:
  type: NodePort
  ports:
  - port: 8800
    targetPort: 80
    protocol: TCP
    nodePort: 30990
    name: http
  selector:
    app: demo-pod

4 使用 kubectl 命令通过nginx.yaml创建 nginx 实例

将nginx的yaml文件复制到 master 节点的用户根目录

 multipass transfer nginx_pod.yml master:./

进入到 master节点并切换到root 用户

 multipass shell master
 
 sudo su

进行 nginx安装

kubectl apply -f nginx_pod.yml

验证 nginx 安装

由于我们 service 中设置了节点端口指向,将 nginx 的端口映射到了节点的30990上,所以需要使用master 节点的 ip 和svc 中指定的端口进行访问

 curl 192.168.64.3:30990

在pod内进行访问验证

# 进入到 pod 内
kubectl exec -it nginx-deployment-7fdd7d87b7-svmvc bash
# 访问验证
curl 127.0.0.1:80

image.png

2. 安装mysql

在完成了k3s 安装,命名空间的创建等操作步骤后进行安装

构建mysql的部署 yaml 文件

---

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-conf
  namespace: test
data:
  mysql.cnf: |
    [mysqld]

     pid-file        = /var/run/mysqld/mysqld.pid
     socket          = /var/run/mysqld/mysqld.sock
     datadir         = /var/lib/mysql
     
     symbolic-links=0
     sql-mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION


---

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
  namespace: test
spec:
  type: NodePort
  selector:
    app: my-mysql
  ports:
    - port: 3306
      targetPort: 3306
      nodePort: 32306

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-mysql
  namespace: test
  labels:
    app: my-mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-mysql
  template:
    metadata:
      labels:
        app: my-mysql
    spec:
      containers:
        - name: my-mysql
          image: mysql:8.0.30
          imagePullPolicy: IfNotPresent
          resources:
              limits:
                cpu: 0.2
                memory: 1G
              requests:
                cpu: 0.2
                memory: 1G
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: root
            - name: MYSQL_USER
              value: test
            - name: MYSQL_PASSWORD
              value: test
          ports:
            - containerPort: 3306
              protocol: TCP
              name: http
          volumeMounts:
            - name: my-mysql-data
              mountPath: /var/lib/mysql
            - name: mysql-conf
              mountPath: /etc/mysql/mysql.conf.d
      volumes:
        - name: mysql-conf
          configMap:
            name: mysql-conf
        - name: my-mysql-data
          hostPath:
            path: /var/k3s/data/mysql
            type: Directory

进行 master,worker1,worker2 节点目录初始化

multipass exec master -- /bin/bash -c "sudo mkdir -p /var/k3s/data/mysql"
multipass exec worker1 -- /bin/bash -c "sudo mkdir -p /var/k3s/data/mysql"
multipass exec worker2 -- /bin/bash -c "sudo mkdir -p /var/k3s/data/mysql"

初始化 mysql

进入到master 节点内

multipass shell master

进入到 root 权限

sudo su

使用上面的 yaml创建 mysql_deployment.yaml,并执行初始化容器

kubectl apply -f mysql_deployment.yaml

检查mysql 是否完成启动

kubectl get pod -n test

image.png

处理异常

如果发现无法正常启动,可以检查容器启动情况,查看具体信息

kubectl describe pod my-mysql-5776498d78-rnfss -n test

my-mysql-5776498d78-rnfss 是pod名称

test 的命名空间名称

3. 安装redis

在完成了k3s 安装,命名空间的创建等操作步骤后进行安装

进行 master,worker1,worker2 节点目录初始化

multipass exec master -- /bin/bash -c "sudo mkdir -p /var/k3s/data/redis"
multipass exec worker1 -- /bin/bash -c "sudo mkdir -p /var/k3s/data/redis"
multipass exec worker2 -- /bin/bash -c "sudo mkdir -p /var/k3s/data/redis"

构建部署 redis 的 yaml 文件

apiVersion: v1
kind: ConfigMap
metadata:
  name: example-redis-config
  namespace: test
data:
  redis-config: |
    maxmemory 2mb
    maxmemory-policy allkeys-lru
    dir /data
    appendonly yes
    save 900 1
    save 300 10
    save 60 10000
---
apiVersion: v1
kind: Service
metadata:
  name: redis-master
  namespace: test
  labels:
    app: redis
spec:
  type: NodePort # 默认类型是ClusterIP不能制定nodePort端口
  selector:
    app: redis
  ports:
    - port: 6379
      targetPort: 6379
      nodePort: 32379 # 端口范围是:30000-32767不能超出范围
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  namespace: test
  labels:
    app: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
        - name: redis
          image: 'redis:6.2.5'
          command:
            - redis-server
            - /redis-conf/redis.conf
          env:
            - name: MASTER
              value: 'true'
          ports:
            - containerPort: 6379
          resources:
            limits:
              cpu: '0.1'
              memory: 1G
          volumeMounts:
            - mountPath: /data
              name: data
            - mountPath: /redis-conf
              name: config
      volumes:
        - name: data
          hostPath:
            path: /var/k3s/data/redis
            type: Directory
        - name: config
          configMap:
            name: example-redis-config
            items:
              - key: redis-config
                path: redis.conf

检查redis 是否完成启动

kubectl get pod -n test

image.png