0%

1
2
3
4
5
6
# 导出根证书
kubectl get secret example-secret -o jsonpath='{.data.ca\.crt}'| base64 --decode

kubectl get secret example-secret -o jsonpath='{.data.tls\.crt}'| base64 --decode

kubectl get secret example-secret -o jsonpath='{.data.tls\.key}'| base64 --decode

导出Secret

1
kubectl get secret example-secret -o yaml > example-secret.yaml

导出内容格式如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
apiVersion: v1
data:
ca.crt: ...
tls.crt: ...
tls.key: ...
kind: Secret
metadata:
annotations:
cert-manager.io/alt-names: '...'
cert-manager.io/certificate-name: ...
cert-manager.io/common-name: Tianjin Pengan
cert-manager.io/ip-sans: 192.168.0.2
cert-manager.io/issuer-group: cert-manager.io
cert-manager.io/issuer-kind: ClusterIssuer
cert-manager.io/issuer-name: selfsigned-cluster-issuer
cert-manager.io/subject-organizations: ...
cert-manager.io/uri-sans: ""
creationTimestamp: "2024-09-10T10:54:59Z"
labels:
controller.cert-manager.io/fao: "true"
name: tjpengan-io-secret
namespace: default
resourceVersion: "1730340"
uid: 1c7d877b-ed86-4a1a-ad8c-0d8466c46506
type: kubernetes.io/tls

Base64解码

1
2
3
4
5
# cert
cat example-secret.yaml | grep tls.crt | awk '{print $2}' | base64 --decode > example-secret.cert

#key
cat example-secret.yaml | grep tls.key | awk '{print $2}' | base64 --decode > example-secret.key

Kubectl部署

配置文件

Helm部署

添加helm库

1
2
3
4
5
6
7
8
9
10
11
# 添加库
helm repo add bitnami https://charts.bitnami.com/bitnami

# 更新库缓存
helm repo update

# 搜索redis镜像
helm search repo redis

# 获取package的values.yaml
helm show values bitnami/redis > values-default.yaml

配置 values.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
auth:
password: 123456 # redis 访问密码
master:
service:
type: NodePort # 服务对外暴露端口方式
persistence: # 配置点存储
storageClass: ""
size: 8Gi
replica:
service:
type: NodePort
persistence:
storageClass: ""
size: 8Gi

部署

1
helm install -f values.yaml redis bitnami/redis --namespace --create-namespace

参考

kubernetes环境部署单节点redis - 紫色飞猪 - 博客园 (cnblogs.com)

K8S如何部署Redis(单机、集群)_k8部署redis单节点-CSDN博客

4. K8S发布redis主从-CSDN博客

redis集群 - Helm3-安装Redis - 全栈工程师进阶 - SegmentFault 思否

手动管理证书

生成证书

参考
[[Others/OpenSSL生成自签名证书|OpenSSL生成自签名证书]]

导入证书

1
kubectl create secrets tls example-io-tls --key example.io.key --cert example.io.crt

手动管理证书可忽略下边的安装过程,跳转到证书配置

使用cert-manager管理证书

部署cert-manager

方式一: 使用Helm部署(推荐)

1
2
3
4
5
6
7
8
9
10
11
# 添加镜像源
helm repo add jetstack https://charts.jetstack.io

#获取配置文件
helm show values jetstack/cert-manager > cert-manager-values.yaml

# 部署cert-mangaer
helm upgrade cert-manager jetstack/cert-manager \
--namespace cert-manager \
--install --create-namespace \
--set crds.enabled=true

方式二: 使用kubectl部署

1
2
3
4
5
6
7
8
9
# Kubernetes 1.16+
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.0/cert-manager.yaml
# Kubernetes <1.16
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.1.0/cert-manager-legacy.yaml

# Kubernetes 1.15+
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.16.1/cert-manager.yaml
# Kubernetes <1.15
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.16.1/cert-manager-legacy.yaml

创建ClusterIssuer/Issuer

公网域名证书

Issuer 与 ClusterIssuer 的区别是 ClusterIssuer 可跨命名空间使用,而 Issuer 需在每个命名空间下配置后才可使用。这里我们使用 ClusterIssuer,其类型选择 Let‘s Encrypt。

正式环境速率限制(每个注册域名可签发的证书数量(每周 50 份)),使用测试环境测试一切正常后再切换正式环境。

letsencrypt-issuer-staging.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
email: <YOUR EMAIL> # replice this
server: https://acme-staging-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-staging
solvers:
- http01:
ingress:
class: traefik
selector: {}

letsencrypt-issuer-prod

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: <YOUR EMAIL> # replice this
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: traefik
selector: {}

说明:

metadata.name 创建的签发机构的名称,创建证书的时候会引用
spec.acme.email 邮箱,证书快过期的时候会有邮件提醒,不过cert-manager会利用acme协议自动给我们重新颁发证书来续期
spec.acme.server acme 协议的服务端,由官方给出
spec.acme.privateKeySecretRef 指示此签发机构的私钥将要存储到哪个Secret对象中
spec.acme.solvers.http01 指示签发机构使用HTTP-01的方式进行acme协议 (还可以用DNS方式,acme协议的目的是证明这台机器和域名都是属于你的,然后才准许给你颁发证书)

自签名证书

selfsigned-issuer.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: selfsigned-cluster-issuer
spec:
selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: selfsigned-ca
spec:
isCA: true
commonName: selfsigned-ca
secretName: root-secret
privateKey:
algorithm: ECDSA
size: 256
subjects:
organizations:
-
issuerRef:
name: selfsigned-cluster-issuer
kind: ClusterIssuer
group: cert-manager.io
#---
## 使用自定义根证书
## 导入根证书 kubectl create secret tls ca-secret --key root-ca.key --cert root-ca.crt
#apiVersion: cert-manager.io/v1
#kind: ClusterIssuer
#metadata:
# name: selfsigned-cluster-issuer
#spec:
# ca:
# secretName: ca-secret

spec.subjects.organizations:

创建域名证书

公网域名证书

example-io-tls.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: example-io-tls
spec:
secretName: example-io-secret #
issuerRef:
name: letsencrypt-staging # 使用自签名证书时替换为 selfsigned-cluster-issuer
kind: ClusterIssuer
duration: 2160h
renewBefore: 360h
dnsNames:
- example.io
ipAddresses:
- 192.168.1.1

生产环境使用建议

实际生产环境中使用cert-manager可以考虑以下建议:

  1. 将CA的SecretIssuer放在某个独立的命名空间中,与其它业务的命名空间隔离起来。
  2. 如果是CA类型的Issuer,要记得定期更新根CA证书。
  3. 如果服务可被公网访问,同时又不想花钱买域名证书,可以采用Letsencrypt类型的Issuer,目前支持两种方式验证域名的所有权,基于DNS记录的验证方案和基于文件的HTTP验证方案
  4. cert-manager还提供ingress-shim方式,自动为Ingress资源生成证书,只需要在Ingress资源上打上一些标签即可,详细可参考这里

spec.secretName 指示证书最终存到哪个 Secret 中

spec.issuerRef.kind 值为 ClusterIssuer 说明签发机构不在本 namespace 下,而是在全局

spec.issuerRef.name 我们创建的签发机构的名称 (ClusterIssuer.metadata.name)

spec.duration 证书过期时间

spec.renewBefore 在过期前自动更新

spec.dnsNames 指示该证书的可以用于哪些域名

spec.acme.config.http01.domains 指示该证书的可以用于哪些域名

Traefik配置证书

终端安装证书

获取CA证书,root-ca.crt,k3s导出证书 参考K3s导出证书


k8s中使用cert-manager玩转证书-腾讯云开发者社区-腾讯云 (tencent.com)

k8s 使用cert-manager证书管理自签-CSDN博客

k8s部署cert-manager实现证书自动化_cert-manager.yaml-CSDN博客

Cert-Manager 实现 K8s 服务域名证书自动化续签 - 知乎 (zhihu.com)

手把手教你使用 cert-manager 签发免费证书 - 腾讯云原生 - 博客园 (cnblogs.com)

在 k3s 内使用 cert-manager 管理证书 (bowser1704.github.io)

用 k3s 轻松管理 SSL 证书 | Linux 中国 - 知乎

k8s中级篇-cert-manager+Let‘s Encrypt自动证书签发_cert-manager let’s encrypt-CSDN博客
k3s 使用 Letsencrypt 和 Traefik 完成 https 入口部署-腾讯云开发者社区-腾讯云 (tencent.com)

容器服务 使用 cert-manager 签发免费证书-实践教程-文档中心-腾讯云 (tencent.com)

使用cert-manager为Traefik IngressRoute自动签发Let’s Encrypt证书 – 桃又的技术笔记 (taoyouh.cn)

内网证书

cert-manager管理内网k8s开发环境证书 - hueidou163 - 博客园 (cnblogs.com)

SelfSigned - cert-manager (k8s-docs.github.io)

k8s 使用cert-manager证书管理自签-CSDN博客

Kubernetes (K8S) 中Traefik自动申请证书-腾讯云开发者社区-腾讯云 (tencent.com)

k8s ingress配置自签名证书,并解决Kubernetes Ingress Controller Fake Certificate-CSDN博客

K8s & K3s 集群中应用自动签发 Https 证书 - 流雨声 - 博客园 (cnblogs.com)

Linux 源

清华 https://mirrors.tuna.tsinghua.edu.cn

阿里 http://mirrors.aliyun.com

腾讯 https://mirrors.tencent.com

华为 https://mirrors.huaweicloud.com

中国科技大学 https://mirrors.ustc.edu.cn

华中科技大学 http://mirror.hust.edu.cn

Docker 镜像仓库

DockerHub(docker.io)

网易 http://hub-mirror.c.163.com

中国科技大学 https://docker.mirrors.ustc.edu.cn (不可用)

道客 https://docker.m.daocloud.cn (参考官方文档)

腾讯 https://mirror.ccs.tencentyun.com

华为 https://mirror.swr.myhuaweicloud.com

阿里云 https://registry.cn-hangzhou.aliyuncs.com

[^注]: 阿里可申请私有加速,需注册账号,注册后地址修改为 https://{私有ID}.mirror.aliyuncs.com。详细信息参考官方文档

谷歌镜像仓库(gcr.io k8s.gcr.io)

阿里 https://registry.aliyuncs.com/google_containers

中科大 https://gcr.mirrors.ustc.edu.cn (2022.8之后不再更新镜像,校外访问返回403)

华为 https://mirror.swr.myhuaweicloud.com

道客 https://m.daocloud.io/k8s.gcr.io 文档

CoreOS镜像仓库(quay.io )

道客 https://m.daocloud.io/quay.io 参考支持镜像列表

Github镜像仓库(ghcr.io )

道客 https://m.daocloud.io/ghcr.io 参考支持镜像列表

Helm 源

ArtifactHub https://artifacthub.io/

华为 https://mirrors.huaweicloud.com/helm/

bitnami https://charts.bitnami.com/bitnami

Google https://gcr.io/kubernetes-helm

容器配置

Docker(/etc/docker/daemon.json )

1
2
3
4
5
6
7
8
9
10
11
{

"registry-mirrors": [
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com"
],
"insecure-registries": [],
"exec-opts":["native.cgroupdriver=systemd"]

}

Containerd(/etc/containerd/config.toml)

1
2
3
4
5
6
7
8

[plugins.cri.registry]
[plugins.cri.registry.mirrors]
[plugins.cri.registry.mirrors."quay.io"]
endpoint = ["https://quay.tencentcloudcr.com"]
[plugins.cri.registry.mirrors."docker.io"]
endpoint = ["https://mirror.ccs.tencentyun.com"]

K3s中Containerd容器(/var/lib/rancher/k3s/agent/etc/containerd/config.toml)

K3s 默认的 containerd 配置文件目录为/var/lib/rancher/k3s/agent/etc/containerd/config.toml,但直接操作 containerd 的配置文件去设置镜像仓库或加速器相比于操作 docker 要复杂许多。K3s 为了简化配置 containerd 镜像仓库的复杂度,K3s 会在启动时检查/etc/rancher/k3s/中是否存在 文件,如果存在该文件,就会根据 registries.yaml 的内容转换为 containerd 的配置并存储到/var/lib/rancher/k3s/agent/etc/containerd/config.toml,从而降低了配置 containerd 镜像仓库的复杂度。

1
2
3
4
5
6
7
8
9
10
11
mirrors:
"172.31.6.200:5000":
endpoint:
- "http://172.31.6.200:5000"
"rancher.ksd.top:5000":
endpoint:
- "http://172.31.6.200:5000"
"docker.io":
endpoint:
- "https://fogjl973.mirror.aliyuncs.com"
- "https://registry-1.docker.io"

containerd 与 docker 都有默认仓库,并且都为 docker.io。如果配置中未指定 mirror 为 docker.io,重启 containerd 后会自动加载 docker.io 配置。与 docker 不同的是,containerd 可以修改 docker.io 对应的 endpoint( 默认为 https://registry-1.docker.io ),而 docker 无法修改。

docker 中可以通过 registry-mirrors 设置镜像加速地址。如果 pull 的镜像不带仓库地址(项目名+镜像名:tag),则会从默认镜像仓库去拉取镜像。如果配置了镜像加速地址,会先访问镜像加速仓库,如果没有返回数据,再访问默认吧镜像仓库。

k3s完整配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mirrors:
"192.168.50.119":
endpoint:
- "http://192.168.50.119"
"docker.io":
endpoint:
- "https://7bezldxe.mirror.aliyuncs.com"
- "https://registry-1.docker.io"
configs:
"192.168.50.119":
auth:
username: '' # this is the registry username
password: '' # this is the registry password
tls:
cert_file: '' # path to the cert file used in the registry
key_file: '' # path to the key file used in the registry
ca_file: '' # path to the ca file used in the registry
"docker.io":
auth:
username: '' # this is the registry username
password: '' # this is the registry password
tls:
cert_file: '' # path to the cert file used in the registry
key_file: '' # path to the key file used in the registry
ca_file: '' # path to the ca file used in the registry

镜像转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14

#gcr.io
docker pull gcr.io/kubernetes-helm/tiller:v2.16.1
docker pull gcr.mirrors.ustc.edu.cn/kubernetes-helm/tiller:v2.16.1

#k8s.gcr.io
#docker pull k8s.gcr.io/kube-proxy:v1.15.5
docker pull gcr.mirrors.ustc.edu.cn/google-containers/kube-proxy:v1.15.5

#quay.io
docker pull quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1
docker pull quay.mirrors.ustc.edu.cn/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1


转换为gcr.io镜像

1
2
3
docker pull registry.aliyuncs.com/google_containers/coredns:1.6.5
docker tag registry.aliyuncs.com/google_containers/coredns:1.6.5 k8s.gcr.io/coredns:1.6.5
docker rmi registry.aliyuncs.com/google_containers/coredns:1.6.5

K8S批量下载docker images

1
kubeadm config images list
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

#!/bin/bash
images=( # 下面的镜像应该去除"k8s.gcr.io/"的前缀,版本换成上面获取到的版本
kube-apiserver:v1.12.1
kube-controller-manager:v1.12.1
kube-scheduler:v1.12.1
kube-proxy:v1.12.1
pause:3.1
etcd:3.2.24
coredns:1.2.2
)

for imageName in ${images[@]} ; do
docker pull registry.aliyuncs.com/google_containers/$imageName
docker tag registry.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.aliyuncs.com/google_containers/$imageName
done

更新版

1
2
3
4
5
6
7
8
9
10
11

#!/bin/bash
url=registry.aliyuncs.com
version=v1.16.4
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
docker pull $url/$imagename
docker tag $url/$imagename k8s.gcr.io/$imagename
docker rmi -f $url/$imagename
done

或(V1.3以上)

1
2
kubeadm init --image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.13.0 --pod-network-cidr 192.168.1.100/24

K3s安装

参考 [[K3s安装|K3s安装]]

组件配置信息

组件 端口 访问地址 说明
CoreDNS 53 DNS服务器,实现域名映射
MySQL 3306 Gitea、Harbor等组件的依赖,与PostgreSQL二选一即可。安装参考K3s安装MySQL
PostgreSQL 5432 Gitea、Harbor等组件的依赖,与MySQL二选一即可。安装参考K3s安装PostgreSQL
Cert-Manager 证书管理服务,有公网域名推荐使用,内网部署可生成自签名证书
Traefik 443 https://dashboard.example.io 负载均衡器,服务入口
Harbor https://harbor.example.io 私有镜像库,镜像缓存。安装参考K3s安装
Gitea https://gitea.example.io 源代码仓库,ssh与宿主机ssh端口冲突,需要协调
Drone https://drone.example.io 基于Docker的自动编译服务,与Gitea Runner二选一即可。
Gitea Runner Gitea 自动编译服务,与Drone 二选一即可。
SonarQube https://sonar.example.io 静态代码审查。

组件部署

MySQL

参考 K3s部署MySQL

1
2
3
4
5
6
7
8
9
10
11
# k3s使用 local-path 部署
kubectl apply -f https://gitee.com/Chemmy/kube-template/MySQL/mysql-pvc-local-path.yaml

# 部署mysql-config
kubectl apply -f https://gitee.com/Chemmy/kube-template/MySQL/mysql-config.yaml

# 部署deploy
kubectl apply -f https://gitee.com/Chemmy/kube-template/MySQL/mysql-deployment.yaml

# 部署service(NodePort 方式)
kubectl apply -f https://gitee.com/Chemmy/kube-template/MySQL/mysql-service.yaml

PostgresSQL

参考 K3s部署PostgreSQL

1
2
3
4
5
6
7
8
9
10
11
# k3s使用 local-path 部署
kubectl apply -f https://gitee.com/Chemmy/kube-template/PostgreSQL/postgres-pvc-local-path.yaml

# 部署config
kubectl apply -fhttps://gitee.com/Chemmy/kube-template/PostgreSQL/postgres-config.yaml

# 部署deploy
kubectl apply -fhttps://gitee.com/Chemmy/kube-template/PostgreSQL/postgres-deployment.yaml

# 部署service(NodePort 方式)
kubectl apply -fhttps://gitee.com/Chemmy/kube-template/PostgreSQL/postgres-service.yaml

Traefik

1
2
3
4
5
6
7
8
```

### cert-manager

参考[[Kubernetes/K3s证书管理|K3s证书管理]]

```bash

Harbor

参考K3s部署Harbor私有镜像仓库

1

Gitea

参考K3s部署Gitea

1

Drone

参考K3s部署Drone

1

SonarQube

参考K3s部署SonarQube

1

组件之间联动配置

参考

Gitea官方文档

Gitea README

Drone官方文档

Helm官方文档

Harbor官方文档

Traefik Proxy Documentation - Traefik

k3s 部署gitea+drone_golang k3s-CSDN博客

Harbor 结合 Traefik 的 HA 安装配置-腾讯云开发者社区-腾讯云 (tencent.com)

Traefik - Kubernetes 配置TCP/HTTP服务-腾讯云开发者社区-腾讯云 (tencent.com)

Drone CI使用docker插件构建和推送镜像 - wosperry - 博客园 (cnblogs.com)

在 Kubernetes 上部署 Drone 持续集成环境 | Hanggi - NGNL

Gitea 与 Drone 集成实践:完全基于 Docker 搭建的轻量级 CI/CD 系统 - Gitea - 博客园 (cnblogs.com)

Helm Chart Kubernetes安装SonarQube_helm安装sunaqube-CSDN博客

安装基础环境

新装环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# master安装
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
INSTALL_K3S_EXEC='--write-kubeconfig-mode=644' sh -

# 加入其他节点
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
K3S_URL=https://<k3s-server-ip>:6443 \
K3S_TOKEN=<token> \
INSTALL_K3S_EXEC='--write-kubeconfig-mode=644' sh -

# EXEC参数
# --write-kubeconfig-mode=644 设置配置文件权限
# --service-node-port-range=1-65535 解除端口限制,默认30000-32767
# --disable traefik 禁用Traefik Ingress
# --default-local-storage-path=/mnt/storage/k3s # 自定义本地存储(local-path-config)的默认存储路径

# 环境变量
# INSTALL_K3S_MIRROR=cn 设置未中国区镜像
# INSTALL_K3S_SKIP_SELINUX_RPM=true 安装由于selinux导致失败时可加此配置跳过k3s selinux配置,注意是在 INSTALL_K3S_MIRROR后添加

其中<k3s-server-ip>是K3s服务器的IP地址,<token>是由K3s服务器生成的唯一令牌。可以使用以下命令在K3s服务器上获取此令牌:

1
sudo cat /var/lib/rancher/k3s/server/node-token

设置 kubeconfig 文件路径用于对 Kubernetes 集群的访问。

1
echo "export KUBECONFIG=/etc/rancher/k3s/k3s.yaml" >> ~/.bashrc

现有环境修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo systemctl stop k3s.service
vim /etc/systemd/system/k3s.service
# 修改ExecStart
# 原有内容
ExecStart=/usr/local/bin/k3s \
server \
'--write-kubeconfig-mode=644'
# 修改后
ExecStart=/usr/local/bin/k3s \
server \
'--write-kubeconfig-mode=644' \
'--service-node-port-range=1-65535' \
'--default-local-storage-path=/mnt/storage/k3s' \


sudo systemctl daemon-reload
sudo systemctl start k3s.service

安装管理工具Helm

1
2
3
4
5
6
7
8
9
10
11
#安装helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# ubuntu 使用snap安装
sudo snap install helm --classic

# 离线安装
# 下载最新版离线安装包 https://github.com/helm/helm/releases
tar xf helm-v2.11.0-linux-amd64.tar.gz
cp linux-amd64/helm linux-amd64/tiller /usr/local/bin/

添加命令自动补全

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 安装自动补全
sudo apt install bash-completion

source /usr/share/bash-completion/bash_completion

# kubectl自动补全
# 临时使用
echo 'source < (kubectl completion bash)' >> ~/.bashrc

# 永久生效
kubectl completion bash | sudo tee /etc/bash_completion/kubectl > /dev/null

# helm 自动补全
# 临时使用
echo 'source < (helm completion bash)' >> ~/.bashrc

# 永久生效
helm completion bash | sudo tee /etc/bash_completion/helm > /dev/null

常用Helm Charts

Artifact Hub

Bitnami Helm Charts

Microsoft

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 查看集权所有资源
kubectl get all -A -o wide

# 查看指定命名空间
kubectl get all -n {namespace name}

# 查看容器日志
kubectl logs -n {namespace name} pod/{pod name}

# 查看指定命名空间下资源详细信息
kubectl describe -n {namespace name} [service|pod|secret|carificate|...]

# 查看节点相关
kubectl get node --show-labels -o wide

# 重启pod
kubectl rollout restart {pod name} -n

# 伸缩实例数量
kubectl scale deploy whoami --replicas=5

# 查看 k3s 集群配置文件
kubectl cluster-info

## Helm常用命令
# 获取charts的values文件
helm show values bitnami/redis > values.yaml

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 创建2副本的whoami应用,默认1副本
kubectl create deploy whoami --image=traefik/whoami --replicas=2

# 查看部署应用信息
kubectl describe deploy whoami
# 监控Pod状态,通过缩容\扩容可直观看到Pod的调度状态
kubectl get pods --watch

kubectl scale deploy whoami --replicas=5

# 请求链路理解
request public-ip -> node-port -> svc-port -> pod-port -> container

# 发布K3s内网的服务
kubectl expose deploy whoami --port=80

# 查看服务状态
kubectl get svc whoami -owide
kubectl describe svc whoami

# 映射端口到宿主机
# --tareget-port 容器映射端口
# --external-ip 指定公网IP
# --prot 集群内暴露端口
# --node-port type=NodePort时提供给集群外访问的端口
kubectl expose deploy whoami --type=LoadBalancer --port=80 --external-ip <PUBLIC_IP>

# 清空测试
kubectl delete all --all

配置国内源(私有镜像库)

K3s 默认的 containerd 配置文件目录为/var/lib/rancher/k3s/agent/etc/containerd/config.toml,但直接操作 containerd 的配置文件去设置镜像仓库或加速器相比于操作 docker 要复杂许多。K3s 为了简化配置 containerd 镜像仓库的复杂度,K3s 会在启动时检查/etc/rancher/k3s/中是否存在 registries.yaml 文件,如果存在该文件,就会根据 registries.yaml 的内容转换为 containerd 的配置并存储到/var/lib/rancher/k3s/agent/etc/containerd/config.toml,从而降低了配置 containerd 镜像仓库的复杂度。

K3s 镜像仓库配置文件由两大部分组成:mirrors 和 configs:

  • Mirrors 是一个用于定义专用镜像仓库的名称和 endpoint 的指令
  • Configs 部分定义了每个 mirror 的 TLS 和证书配置。对于每个 mirror,你可以定义 auth 和/或 tls

containerd 使用了类似 K8S 中 svc 与 endpoint 的概念,svc 可以理解为访问名称,这个名称会解析到对应的 endpoint 上。也可以理解 mirror 配置就是一个反向代理,它把客户端的请求代理到 endpoint 配置的后端镜像仓库。mirror 名称可以随意填写,但是必须符合 IP 或域名的定义规则。并且可以配置多个 endpoint,默认解析到第一个 endpoint,如果第一个 endpoint 没有返回数据,则自动切换到第二个 endpoint,以此类推。

1
2
3
4
5
6
7
8
9
10
11
12
mirrors:
"172.31.6.200:5000":
endpoint:
- "http://172.31.6.200:5000"
"rancher.ksd.top:5000":
endpoint:
- "http://172.31.6.200:5000"
"docker.io":
endpoint:
- "https://fogjl973.mirror.aliyuncs.com"
- "https://registry-1.docker.io"

非安全(http)私有仓库配置

配置非安全(http)私有仓库,只需要在 endpoint 中指定 http 协议头的地址即可。

在没有 TLS 通信的情况下,需要为 endpoints 指定 http://,否则将默认为 https。

无认证
1
2
3
4
mirrors:
"172.31.6.200:5000":
endpoint:
- "http://172.31.6.200:5000"
有认证
1
2
3
4
5
6
7
8
9
mirrors:
"35.182.134.80":
endpoint:
- "http://35.182.134.80"
configs:
"35.182.134.80":
auth:
username: admin # this is the registry username
password: Harbor12345 # this is the registry password

安全(https)私有仓库配置

使用授信 ssl 证书
1
2
3
4
5
6
7
8
9
mirrors:
"harbor.kingsd.top":
endpoint:
- "https://harbor.kingsd.top"
configs:
"harbor.kingsd.top":
auth:
username: admin # this is the registry username
password: Harbor12345 # this is the registry password
使用自签 ssl 证书

如果后端仓库使用的是自签名的 ssl 证书,那么需要配置 CA 证书 用于 ssl 证书的校验。

1
2
3
4
5
6
7
8
9
10
11
mirrors:
"harbor-ksd.kingsd.top":
endpoint:
- "https://harbor-ksd.kingsd.top"
configs:
"harbor-ksd.kingsd.top":
auth:
username: admin # this is the registry username
password: Harbor12345 # this is the registry password
tls:
ca_file: /opt/certs/ca.crt
ssl 双向认证

如果镜像仓库配置了双向认证,那么需要为 containerd 配置 ssl 证书用于 镜像仓库对 containerd 做认证。

1
2
3
4
5
6
7
8
9
10
11
12
13
mirrors:
"harbor-ksd.kingsd.top":
endpoint:
- "https://harbor-ksd.kingsd.top"
configs:
"harbor-ksd.kingsd.top":
auth:
username: admin # this is the registry username
password: Harbor12345 # this is the registry password
tls:
ca_file: /opt/certs/ca.crt # path to the ca file used in the registry
cert_file: /opt/certs/harbor-ksd.kingsd.top.cert # path to the cert file used in the registry
key_file: /opt/certs/harbor-ksd.kingsd.top.key # path to the key file used in the registry

加速器配置

Containerd 与 docker 都有默认仓库,均为 docker.io 。如果配置中未指定 mirror 为 docker.io,containerd 后会自动加载 docker.io 配置。与 docker 不同的是,containerd 可以修改 docker.io 对应的 endpoint(默认为 https://registry-1.docker.io),而 docker 无法修改。

Docker 中可以通过 registry-mirrors 设置镜像加速地址。如果 pull 的镜像不带仓库地址(项目名+镜像名:tag),则会从默认镜像仓库去拉取镜像。如果配置了镜像加速地址,会先访问镜像加速仓库,如果没有返回数据,再访问默认的镜像仓库。

Containerd 目前没有直接配置镜像加速的功能,但 containerd 中可以修改 docker.io 对应的 endpoint,所以可以通过修改 endpoint 来实现镜像加速下载。因为 endpoint 是轮询访问,所以可以给 docker.io 配置多个仓库地址来实现 加速地址+默认仓库地址。如下配置示例:

1
2
3
4
5
mirrors:
"docker.io":
endpoint:
- "https://fogjl973.mirror.aliyuncs.com"
- "https://registry-1.docker.io"

参考

Kubernetes 入门到实践:搭建 K3s 集群初体验 - 知乎 (zhihu.com)

离线安装Air-Gap Install | K3s

解决SuperMicro主板风扇转速过低告警

现象

系统启动后风扇忽高忽低,进入IPMI后台可以看到,看到传感器日志里大量的告警

造成此问题的原因是风扇转速过低,触发了超微的风扇转速允许的下限,从而强制满速运转,而在满速后主板又很快发现没有问题,且此时温度较低,风扇开始降速,直到降速到下限以下,重复此过程。

在进入IPMI后台管理界面后风扇速度有四种智能模式可调

  • Standard: zone0和zone1 风速为50%

  • Optimal: 风速为30%

  • Full: 风速为100%

  • Heavy IO: zone0 为50%,zone1 为75%

解决方法

1. 在服务器上安装IPMItool

1
2
apt install ipmitool # Ubuntu/Debian指令
yum install ipmitool # CentOS指令

2. 设置风扇转速

1
2
3
# 风扇名可以看告警里边的对应风扇名
ipmitool sensor thresh FAN1 lower 100 125 125
ipmitool sensor thresh FANA lower 100 125 125

3. Windows 下远程操作IPMI

ipmitool windows 版 下载地址

1
2
ipmitool -H [IPMI网口IP地址] -U [IMPI账户] -P [IPMI密码] sensor thresh FAN1 lower 100 125 125
ipmitool -H [IPMI网口IP地址] -U [IMPI账户] -P [IPMI密码] sensor thresh FANA lower 100 125 125

问题

如果你运行上面的命令后,风扇转速回落后马上又返回原样,这表明服务器的自动调速覆盖了你手动设置的转速。你需要切换服务器风扇策略为全速(Full Speed),在这个策略下服务器不会使用自动调节转速,因此也不会覆盖你手动设置的转速。

运行下面的命令切换到全速模式(也可以进入IPMI界面调整):

1
2
ipmitool -H [IPMI网口IP地址] -U [IMPI账户] -P [IPMI密码] 0x30 0x45 0x01 0x01
# 最后一个0x01表示全速模式。如果为0x00则表示标准(Standard);0x02表示最优(Optimal)

参考

1.解决超微 SuperMicro 主板风扇反复高低转速问题 - 哔哩哔哩 (bilibili.com)

超微服务器Supermicro X9/X10/X11设置风扇转速 - 辰宸的备忘录 (licc.tech)

ipmitool常用命令详解_ipmitool lan set_owlcity123的博客-CSDN博客

服务端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[common]
# TCP通信端口
bind_port = 7000

#UDP通信端口
bind_udp_port = 7001

# 最大连接数
max_pool_count = 50

# 仪表板界面配置
dashboard_port=7500
dashboard_user=admin
dashboard_pwd=admin

# 允许使用的端口号,可以指定范围也可以用‘,’分割
allow_ports = 18081-18090,8080

服务端开机自启配置

1
2
3
sudo vim /etc/systemd/system/frps.service
sudo systemctl enable frps.service
sudo systemctl start frps.service

启动文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description = Frp Server Service
After = network.target

[Service]
Type = simple
User = nobody
Restart = on-failure
RestartSec = 5s
ExecStart = /usr/local/bin/frps -c /usr/local/etc/frp/frps.ini

[Install]
WantedBy = multi-user.target

客户端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[common]
#替换IP地址为服务端IP
server_addr=0.0.0.0
server_port=7000

# windows远程桌面
[rdp]
type=tcp
# 映射IP
local_ip=127.0.0.1
# 映射端口(本地)
local_port=3389
# 远程端口(服务器)注意端口要在允许端口内切未被占用
remote_port=18087