K3S

安装参考: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

docker image mirror

官方的仓库可能比较慢,建议使用镜像。编辑 /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

参考:

Dashboard

可以选装仪表盘,比如:

这里会经常用到 kubectl get secret, kubectl describe secret 两组指令去看登录的 token。

PVC

k3s 文档介绍的 Local Storage Provider 和 Longhorn 都不错。

简单用就选 Local,注意第一次分配 pod 时才真正绑定,pod 所在的初始节点决定了 pvc 的 node,用此 pvc 的 pod 以后也只能在此 node 上调度。 可以去 node 主机的 /var/lib/rancher/k3s/storage/ 找对应的 pvc。

TLS

可以用开源的 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,指定入口只有 websecureweb 入口就走了上面的 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

Others

日志有观察到 orphaned pod 时,可以去 /var/lib/kubelet/pods 清理。