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