安装参考:https://docs.rancher.cn/docs/k3s/quick-start/_index
curl -L http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh >k3s.sh INSTALL_K3S_MIRROR=cn sh k3s.sh --cluster-domain c.c
上面强行借用了 c.c 作为域名,之后访问服务就可以使用 <foobar>.<namespace>.svc.c.c 的方式。之前想用 cc,但是发现影响 *.cc 的解析,作罢。
(当然也可以直接用 c,以下的 c.c 皆可替换为 c)
最好是通过路由配置,直接接入 k3s 的网络,10.42.0.0/15 (10.42.0.0-10.43.255.255):
ip route add 10.42.0.0/15 via 10.0.0.123 # or route add 10.42.0.0/15 10.0.0.123
然后把 DNS 也设置成 10.43.0.10,
或者把它作为 *.c.c 的上游,比如 openwrt dnsmasq 可以编辑 /etc/dnsmasq.conf, 加一行:server=/c.c/10.43.0.10 。
还可以自己去 github 下载指定版本 k3s 二进制 到 /usr/local/bin/ , 然后:
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_MIRROR=cn sh k3s.sh --cluster-domain c.c
注意,ulimit -n 要给够,系统默认 1024 不行,要改。
可以自己手动启动:k3s server --cluster-domain c.c。
官方的仓库可能比较慢,建议使用镜像。编辑 /etc/rancher/k3s/registries.yaml:
mirrors:
docker.io:
endpoint:
- https://hub-mirror.c.163.com
- https://ustc-edu-cn.mirror.aliyuncs.com
重启:systemctl restart k3s or systemctl restart k3s-agent,看效果:crictl info | jq .config.registry.mirrors。
参考:
可以选装仪表盘,比如:
这里会经常用到 kubectl get secret, kubectl describe secret 两组指令去看登录的 token。
k3s 文档介绍的 Local Storage Provider 和 Longhorn 都不错。
简单用就选 Local,注意第一次分配 pod 时才真正绑定,pod 所在的初始节点决定了 pvc 的 node,用此 pvc 的 pod 以后也只能在此 node 上调度。 可以去 node 主机的 /var/lib/rancher/k3s/storage/ 找对应的 pvc。
可以用开源的 jetstack/cert-manager。也可以自己用 lego 生成证书,然后自己写入一个 secret/tls,例子:
cd .lego/certificates # https://kubernetes.io/docs/concepts/configuration/secret/#tls-secrets kubectl create secret tls lego-your.domain --cert your.domain.crt --key your.domain.key --dry-run=client -o yaml | kubectl apply -f -
上面的写法兼顾新建和更新,建议直接在外部环境用脚本定时更新这个证书。
接下来可以给 ingress 用了:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: registry
spec:
tls:
- secretName: lego-your.domain
rules:
- host: svc.cool
http: &http
paths:
- path: /
pathType: Prefix
backend:
service:
name: registry
port:
number: 5000
注意,上面用了 traefik 的一个特性,载入证书后可以给匹配的域名使用,所以不用指定 spec.tls[0].hosts,
而且其它的 ingress 也能不写 spec.tls 而直接使用 https 。
增加一个默认规则,http redirect to https :
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: https
spec:
redirectScheme:
scheme: https
permanent: true
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: http-redirect-to-https
spec:
entryPoints:
- web
routes:
- kind: Rule
match: PathPrefix(`/`)
services:
- kind: TraefikService
name: ping@internal
middlewares:
- name: https
验证一下:
kubectl api-versions | grep traefik kubectl get middlewares.traefik.containo.us kubectl get ingressroutes.traefik.containo.us
接下来的 ingress,如需强制跳转 https ,配置 metadata.annotations,指定入口只有 websecure,web 入口就走了上面的 IngressRoute:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: your-ingress
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: websecure # https://doc.traefik.io/traefik/routing/providers/kubernetes-ingress/
spec:
...
启用 gzip,需要先建一个 Middleware ,假设在 namespace q:
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: compress
spec:
compress:
minResponseBodyBytes: 1000
然后 ingress 就可以配置来启用,注意 Middleware 的名字的格式:Namespace-MiddlewareName@kubernetescrd
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: your-ingress
annotations:
traefik.ingress.kubernetes.io/router.middlewares: q-compress@kubernetescrd
日志有观察到 orphaned pod 时,可以去 /var/lib/kubelet/pods 清理。