恩山无线论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 362|回复: 16

[N1盒子] 【菜鸟小狮子】简记K3S高可用集群部署(基于MYSQL)

[复制链接]
发表于 2020-9-9 17:23 | 显示全部楼层 |阅读模式
本帖最后由 tinylion 于 2020-9-9 18:12 编辑

写在前面的话

由于K8S非常耗资源,N1上跑得的确吃力,因此抛砖迎玉,写点轻量级K3S部署的经验。


本帖架构暂未加入LB服务器。


集群由k3smaster1,k3smaster2,k3swork1,k3swork2,k3smysql57服务器共5台N1组成。

有兴趣的朋友,可以把k3smaster1和k3swork1装一起,k3smaster2和k3swork2装一起,k3smysql57单独1台,这样仅需要3台。

制作母盘

tinylion自编译的5.6.2 ubuntu 18.04 LTS server版,刷入U盘后执行:

1. apt update

2. armbian-config设置时区

3. systemctl disable serial-getty@ttyS2

4. 安装好docker , 设置阿里源

curl -fsSL https://get.docker.com -o get-docker.sh

sh get-docker.sh --mirror Aliyun

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://7cqpsXXX.mirror.aliyuncs.com"]  #替换成自己的阿里源
}
EOF

5.  nano /etc/sysctl.conf

net.ipv4.ip_forward=1 去掉#
vm.swappiness=0
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_nonlocal_bind = 1

6. nano /etc/rc.local

swapoff -a

7. nano /etc/hosts

127.0.0.1   localhost
192.168.1.101 k3smaster1
192.168.1.102 k3smaster2
192.168.1.110 k3smysql57
192.168.1.104 k3swork1
192.168.1.105 k3swork2

(建议在路由器里先做IP和MAC绑定)

8. reboot







评分

参与人数 1恩山币 +2 收起 理由
qml + 2 感谢你的分享,无论怎样,你都是最无私的人!来,说说,你E盘上还有啥一起给我吧!

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2020-9-9 17:23 | 显示全部楼层
本帖最后由 tinylion 于 2020-9-9 17:46 编辑

安装mysql5.7 服务器

母盘先写入EMMC,以下命令都是在EMMC环境下执行,并先开好全局竹梯。

1. hostnamectl set-hostname k3smysql57

2. ./fixwlanmac.sh

3. apt install mysql-server-5.7

4. mysql_secure_installation
先直接回车一次,设置root密码,后面全是直接回车

5. mysql -u root -p

create user 'k3smysql'@'%' identified by 'k3smysql';     %表示外网可以访问

create database k3smysqldb DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

grant all privileges on k3smysqldb.* to 'k3smysql'@'%';

flush privileges;

exit

6. mysql -u k3smysql -p

show databases;
用新建的账户登录,并测试数据库是否存在!

7. nano /etc/mysql/mysql.conf.d/mysqld.cnf

将bind-address    = 127.0.0.1

设置成bind-address    = 0.0.0.0(为可远程访问)

8. reboot   重启一次,然后

service mysql status 查看状态

netstat -tlnp

查看是否有 0.0.0.0:3306  证明远程也能访问

以上完成mysql的安装和设置

windows上装Navicat软件,测试是否可以远程连接mysql5.7


我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2020-9-9 17:23 | 显示全部楼层
本帖最后由 tinylion 于 2020-9-10 15:29 编辑

安装k3smaster服务器

母盘先写入EMMC,以下命令都是在EMMC环境下执行,并先开好全局竹梯。

以安装k3smaster1服务器为例

1. hostnamectl set-hostname k3smaster1

2. ./fixwlanmac.sh
游客,如果您要查看本帖隐藏内容请回复


service k3s status 查看k3s是否是绿色的running状态

如需重新安装可以执行卸载脚本 /usr/local/bin/k3s-uninstall.sh

4. cp /etc/rancher/k3s/k3s.yaml ~/.kube/config

另用一台N1,安装k3smaster2服务器的步骤同上!

若要临时修改启动参数,执行  nano /etc/systemd/system/multi-user.target.wants/k3s.service











我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2020-9-9 17:24 | 显示全部楼层
本帖最后由 tinylion 于 2020-9-15 16:06 编辑

安装k3swork服务器

1. 母盘先写入EMMC,以下命令都是在EMMC环境下执行,并先开好全局竹梯。

以安装k3smaster1服务器为例

1. hostnamectl set-hostname k3swork1

2. ./fixwlanmac.sh
游客,如果您要查看本帖隐藏内容请回复


另用一台N1,安装k3swork2服务器的步骤同上!

我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2020-9-9 17:24 | 显示全部楼层
本帖最后由 tinylion 于 2020-9-15 17:18 编辑

安装rancher UI

运行 kubectl get nodes 查看是否所有节点都加入集群

安装rancher UI管理集群,命令如下:

docker run -d --name=rancher --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher:v2.4.8-linux-arm64

为节约N1,可在装mysql的N1上安装rancher UI做测试用。

上面部署rancher的语句,在内网访问没问题,但在外网映射访问有问题,改为了下面这句

docker run -d --name=rancher --restart=unless-stopped -p 8189:80 -p 8443:443 rancher/rancher:v2.4.8-linux-arm64

路由器打开了8189和8443端口,并做了相应的映射。发现访问http的8189端口,最后还是会自动跳转到https的8443端口!
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2020-9-9 17:53 | 显示全部楼层
本帖最后由 tinylion 于 2020-9-10 15:12 编辑

常用命令

1. kubectl get all --all-namespaces

2.  kubectl get pods -o wide 查看pods资源用的是哪个work

3. kubectl top node 查看当前集群资源占用情况(也用于检查metric服务器是否正常启动)

我的恩山、我的无线 The best wifi forum is right here.
发表于 2020-9-9 18:01 | 显示全部楼层
又见狮子老大技术贴 这是彻底要吧N1推向生产 邻域呀
我的恩山、我的无线 The best wifi forum is right here.
发表于 2020-9-9 18:55 | 显示全部楼层
顶楼主啦..希望楼主多发精品好帖啦.....
我的恩山、我的无线 The best wifi forum is right here.
发表于 2020-9-9 19:28 | 显示全部楼层
谢谢大佬
我的恩山、我的无线 The best wifi forum is right here.
发表于 2020-9-10 02:06 | 显示全部楼层
刚好也在研究k3s,时机太好了,学习一下。
来自安卓客户端来自安卓客户端
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2020-9-10 15:21 | 显示全部楼层
本帖最后由 tinylion 于 2020-9-10 15:51 编辑

简单的应用部署

kubectl run --image=nginx nginx-app --port=80
或生成多个副本

kubectl run nginx --image=nginx --replicas=2 --port=80

kubectl describe pods
把pod id记下来: nginx-app-f75d46bd9-q6c76

kubectl exec -it nginx-app sh

kubectl exec nginx-app-f75d46bd9-q6c76 ps aux

kubectl describe pod nginx-app-f75d46bd9-q6c76

kubectl logs nginx-app-f75d46bd9-q6c76

使用expose命令以NodePort的方式生成服务

kubectl expose deployment nginx-app --port=80 --type=NodePort --target-port=80 --name=nginx-service

kubectl get service -o wide

kubectl delete pods nginx-app
------------------------------------------------
进入pod查看nginx版本

root@k3smaster1:~# kubectl exec -it nginx-app sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
# nginx -v
nginx version: nginx/1.19.2




我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2020-9-10 16:21 | 显示全部楼层
本帖最后由 tinylion 于 2020-9-10 16:54 编辑

部署一个nginx应用

nano nginx-deployment.yaml

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.19.2
        ports:
        - containerPort: 80


kubectl apply -f nginx-deployment.yaml

kubectl get pods -o wide  (可看到已部署到2个work节点)

kubectl expose deployment nginx-deployment --port=80 --type=LoadBalancer (把端口暴露出去)

kubectl get services (可查到真实的端口,如本次是30835)

浏览器访问: http://192.168.1.104:30835/http://192.168.1.105:30835/ 均可正常看到nginx页面

kubectl apply -f nginx-deployment.yaml  删除该部署

提示:执行上句删除时,最后会发现pod和service里依然有nginx的项目,没删除成功,

解决:kubectl get service 然后查到还有kubectl delete service nginx-deployment这个service

kubectl delete service nginx-deployment 执行完这句,发现pod里原来没删除成功的自动没有了。

kubectl get pods --all-namespaces

发现删除不成功,可依次
kubectl get rs
kubectl get deployment
查看是否还有未删除项目
最后才是删除pod
我的恩山、我的无线 The best wifi forum is right here.
发表于 2020-9-13 11:46 来自手机 | 显示全部楼层
狮子大佬 威武 顶顶顶
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2020-9-14 16:30 | 显示全部楼层
本帖最后由 tinylion 于 2020-9-15 22:49 编辑

K3S 部署 wordpress应用

重点参考:https://kubernetes.io/zh/docs/tu ... -persistent-volume/


1. kustomization.yaml

secretGenerator:
- name: mysql-pass
  literals:
  - password=demo123123
resources:
  - mysql-deployment.yaml
  - wordpress-deployment.yaml

2. mysql-deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql/mysql-server:8.0.19
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

3. wordpress-deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - protocol: TCP
      port: 8081
      targetPort: 80
  selector:
    app: wordpress
    tier: frontend
  type: LoadBalancer
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: arm64v8/wordpress:5.5.1-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pv-claim

上述文件放到同一个目录,然后执行

kube apply -k ./

然后用 kubectl get pods 查看是否所有的pod都是 running状态!静等几分钟
kube delete -k ./  把本次部署卸载掉!

执行如:kubectl exec -it wordpress-7c697cc6f6-ww548 sh 可进入pods节点的wordpress容器

然后可以看wp-config.php的配置文件(主要研究上述的yaml里的参数怎么传递到该php文件里的,比如密码)

------------------------------------------------------------------------------------------------------------------------------------------

接下来填mysql 8.0的坑
kubectl get service -o wide可以看到wordpress对应的IP和端口,比如我的访问:192.168.1.105:8081

结果提示服务器无法连接错误

mysql 8.0的远程访问解决办法重点参考:https://www.cnblogs.com/Extnet/p/10044559.html

1. kubectl exec -it wordpress-mysql-8665ddcbb8-27bgm sh   进入mysql容器

2. mysql -uroot -p


3. use mysql;


4. update user set host = 'localhost' where user ='root';


5. ALTER USER 'root'@'localhost' IDENTIFIED BY 'demo123123' PASSWORD EXPIRE NEVER;


6. 如果要更改密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'demo123123';

7. update user set host = '%' where user ='root';


8. FLUSH PRIVILEGES;


9. select host, user, authentication_string, plugin from user;

执行上句如果发现root的左边有%字样,右边有 mysql_native_password字样,就表示远程链接就解决了


然后重启mysql,否则还是提示无法链接(我是把master1,2和work1,2四个N1都重启了!)


再次访问192.168.1.105:8081就出现熟悉的wordpress配置界面了!
-----------------

备忘注意事项:
1. yaml拉取arm64的容器镜像
2. Secret 生成器传输密码
3. pv和pvc的生成,目前PV和PVC固定,如何设置成动态存储!
4. mysql和wordpress的yaml参数如何相互关联
5. mysql多副本如何添加,数据是否自动同步

kubectl logs wordpress-7c697cc6f6-ww548 -f 查看对应容器的logs,排查错误!
————————————————————————————————————————
解决长期困扰我的一个大问题,wordpress做了外网端口映射后,访问超级慢,以下记录排错过程

访问网址,NN分钟后,只加载了文字,格式树状。
用谷歌浏览器,按F12,然后查看console,
出现
style.css:1 Failed to load resource: net::ERR_CONNECTION_TIMED_OUT
index.js:1 Failed to load resource: net::ERR_CONNECTION_TIMED_OUT
print.css:1 Failed to load resource: net::ERR_CONNECTION_TIMED_OUT

说明css没有加载成功。

解决:登录wordpress后台,然后在设置--常规里,把URL更新为 域名网址:端口的格式,保存
之后即可流畅访问wordpress了,当前之前要装屏蔽谷歌字体插件,也装了WPJAM插件!



我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2020-9-15 11:16 | 显示全部楼层
本帖最后由 tinylion 于 2020-9-15 11:34 编辑

免密一次性关机

1. 在mysql那台N1上执行

ssh-keygen -t rsa

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.101

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.102

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.104

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.105

下面是关机脚本:
#!/bin/sh

ssh k3smaster1 "init 0"

ssh k3smaster2 "init 0"

ssh k3swork1 "init 0"

ssh k3swork2 "init 0"

sleep 3

init 0

我的恩山、我的无线 The best wifi forum is right here.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )|网站地图

GMT+8, 2020-9-27 11:33

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表