为什么需要k3s? k8s集群搭建费时费力,需要非常大的集群资源,运行环境还是有一定的门槛,那还学个锤子,成人的世界我全要。
废话不多说,下面我们来实际安装k3s入门容器编排的微服务。
首先需要下载三个资源,如下官方直通车
安装的脚本
1http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh 2
k3s主文件
1http://rancher-mirror.cnrancher.com/k3s/v1.17.5-k3s1/k3s 2
所需要的离线镜像
1http://rancher-mirror.cnrancher.com/k3s/v1.17.5-k3s1/k3s-airgap-images-amd64.tar 2
文件下载完以后,上传到服务器中/data/目录下
升级内核与安装docker请查看前面的博客
内核升级至4.20,docker安装18.6.03
1https://my.oschina.net/rootxxx/blog/3027744 2
下面开始安装mysql5.7,为什么安装mysql?相比ETCD更熟悉mysql
mysql配置文件
1mkdir -p /data/rancher_mysql && \ 2tee /data/rancher_mysql/mysqld.cnf <<-'EOF' 3[client] 4default-character-set=utf8 5 6[mysql] 7default-character-set=utf8 8 9[mysqld] 10symbolic-links=0 11pid-file = /var/run/mysqld/mysqld.pid 12socket = /var/run/mysqld/mysqld.sock 13datadir = /var/lib/mysql 14character-set-server=utf8 15collation-server=utf8_general_ci 16innodb_file_per_table=1 17max_connections=2048 18EOF 19
以docker方式运行mysql
1docker run -d \ 2--name rancher_mysql \ 3--restart=always \ 4-p 3306:3306 \ 5-v /data/rancher_mysql/data:/var/lib/mysql \ 6-v /data/rancher_mysql/log:/var/log/mysql \ 7-v /data/rancher_mysql/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \ 8-v /etc/localtime:/etc/localtime:ro \ 9-e MYSQL_ROOT_PASSWORD=k3sroot \ 10mysql:5.7 && \ 11docker logs -f rancher_mysql 12
数据库运行完毕后,在mysql中创建用于保存集群信息的库.
create database k3s
导入离线镜像至docker中
docker load < /data/k3s-airgap-images-amd64.tar
创建k3s目录
1mkdir -p /data/k3s_dir && \ 2cp -rf /data/k3s /data/k3s_dir/k3s && \ 3chmod 775 /data/k3s_dir/k3s && \ 4chmod 775 /data/k3s-install.sh
设置参数
1export INSTALL_K3S_MIRROR=cn \ 2export INSTALL_K3S_SKIP_START=true && \ 3export INSTALL_K3S_BIN_DIR=/data/k3s_dir \ 4export INSTALL_K3S_SKIP_DOWNLOAD=true \ 5export INSTALL_K3S_VERSION=v1.17.5-k3s1 \ 6export INSTALL_K3S_EXEC='--docker'
安装服务
/data/k3s-install.sh --datastore-endpoint='mysql://root:k3sroot@tcp(127.0.0.1:3306)/k3s' && service k3s start
创建软连接,为了使用起来更接近k8s
ln -s /data/k3s_dir/k3s /bin/kubectl
输入命令验证集群
kubectl get nodes
返回
1NAME STATUS ROLES AGE VERSION 2192-168-100-153 Ready master 99s v1.17.5+k3s1
证明部署成功,下面我们来发布一个Nginx应用,发布至base命名空间 创建命名空间
kubectl create namespace base
部署应用
1kubectl apply -f - <<EOF 2#应用 3kind: Deployment 4apiVersion: apps/v1 5metadata: 6 #名称 7 name: snake-httpd-a 8 #命名空间 9 namespace: base 10spec: 11 # 12 selector: 13 matchLabels: 14 app: snake-httpd 15 ykb: web 16 version: a 17 #模板 18 template: 19 #数据描述[元数据] 20 metadata: 21 #标签 22 labels: 23 #应用 24 app: snake-httpd 25 ykb: web 26 version: a 27 #规格 28 spec: 29 #容器 30 containers: 31 #名称 32 - name: snake-httpd-a 33 #镜像 34 image: busybox 35 ports: 36 - name: http 37 containerPort: 80 38 #镜像挂载目录 39 volumeMounts: 40 - name: time 41 mountPath: /etc/localtime 42 command: ["/bin/sh","-c","echo 'this is snake-httpd-a' > /var/www/index.html; httpd -f -p 80 -h /var/www"] 43 #计算资源配置 44 resources: 45 #启动限制 46 requests: 47 #初始化CPU用量 48 cpu: "100m" 49 #初始化内存用量 50 memory: "128Mi" 51 #最大限制 52 limits: 53 #限制CPU最大用量 54 cpu: "100m" 55 #限制内存最大用量 56 memory: "128Mi" 57 #实际目录挂载 58 volumes: 59 #宿主机时间文件 60 - name: time 61 hostPath: 62 path: /etc/localtime 63--- 64#服务 65kind: Service 66apiVersion: v1 67#数据描述[元数据] 68metadata: 69 #名称 70 name: snake-httpd-a 71 #命名空间 72 namespace: base 73#规格 74spec: 75 #容器 76 selector: 77 #应用 78 app: snake-httpd 79 #对应的应用版本 80 version: a 81 #端口 82 ports: 83 #名称 84 - name: http 85 #协议 86 protocol: TCP 87 #对外开放端口 88 port: 14000 89 #容器开放端口 90 targetPort: 80 91 #类型 92 type: ClusterIP 93 #对外开放的IP地址 94 externalIPs: [192.168.100.153] 95EOF
查看pod与svc运行状态
1kubectl get pods -n base 2 3NAME READY STATUS RESTARTS AGE 4snake-httpd-a-7bc8b96c8d-jjx2w 1/1 Running 0 13s 5 6kubectl get svc -n base 7 8NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE 9snake-httpd-a ClusterIP 10.43.141.221 192.168.100.153 14000/TCP 82s
集群外部访问
1http://192.168.100.153:14000/ 2 3#返回 4this is snake-httpd-a
集群内部访问
1#部署一个客户端 2kubectl apply -f - <<EOF 3#应用 4kind: Deployment 5apiVersion: apps/v1 6metadata: 7 #名称 8 name: snake-httpd-client 9 #命名空间 10 namespace: base 11spec: 12 # 13 selector: 14 matchLabels: 15 app: snake-httpd-client 16 #模板 17 template: 18 #数据描述[元数据] 19 metadata: 20 #标签 21 labels: 22 #应用 23 app: snake-httpd-client 24 #规格 25 spec: 26 #容器 27 containers: 28 #名称 29 - name: snake-httpd-client 30 #镜像 31 image: busybox 32 #镜像挂载目录 33 volumeMounts: 34 - name: time 35 mountPath: /etc/localtime 36 #以终端方式运行 37 tty: true 38 #计算资源配置 39 resources: 40 #启动限制 41 requests: 42 #初始化CPU用量 43 cpu: "100m" 44 #初始化内存用量 45 memory: "128Mi" 46 #最大限制 47 limits: 48 #限制CPU最大用量 49 cpu: "100m" 50 #限制内存最大用量 51 memory: "128Mi" 52 #实际目录挂载 53 volumes: 54 #宿主机时间文件 55 - name: time 56 hostPath: 57 path: /etc/localtime 58EOF 59 60#查看客户端pod名称 61 62kubectl get pods -n base 63 64NAME READY STATUS RESTARTS AGE 65snake-httpd-a-7bc8b96c8d-jjx2w 1/1 Running 0 11m 66snake-httpd-client-5f9bf9bfd6-rnnqp 1/1 Running 0 75s 67 68#登陆客户端 69kubectl exec -it snake-httpd-client-5f9bf9bfd6-rnnqp -n base /bin/sh 70 71#用wget 发起请求,直接采用svc名称即可,无需注册中心,和外部访问一样,内部访问同样返回this is snake-httpd-a 72wget -q -O - http://snake-httpd-a.base:14000 73 74#k8s中采用的DNS提供服务发现,与服务通信直接使用服务名称即可 75#http://{服务名}.{命名空间}:{端口} 76
内存占用情况
1[root@192-168-100-153 /]# free -m 2 total used free shared buff/cache available 3Mem: 3944 944 824 9 2175 2764 4Swap: 0 0 0