k3s入门记录

单节点k3s

前言

大四的时候上了一门软件工程实训课,需要使用client-go去控制k8s在指定的node上创建指定的pod,那时候开始熟悉了k8s的指令,然后就一直想把服务器上的应用换到k8s。不过对于自己的服务器好像并没有多节点的需求,于是选择了K3s,K3s 是一个完全兼容的Kubernetes发行版,而且非常的轻量级。

安装

K3s官方提供了安装脚本:

1
2
3
curl -sfL https://get.k3s.io | sh -
# Check for Ready node, takes ~30 seconds 
sudo k3s kubectl get node

在国内安装会比较慢,可以换国内的源安装,下面这个脚本除了换源还把k3s的配置文件的权限设置为了644,让普通用户也可以使用:

1
2
3
4
5
6
curl –sfL \
     https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
     INSTALL_K3S_MIRROR=cn sh -s - \
     --system-default-registry "registry.aliyuncs.com" \
     --write-kubeconfig ~/.kube/config \
     --write-kubeconfig-mode 644

K3s默认使用containerd容器,还需要设置containerd的镜像源:

1
2
3
4
5
6
7
8
cat > /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
  docker.io:
    endpoint:
      - "https://registry.aliyuncs.com/"
EOF
#https://docker.mirrors.ustc.edu.cn/
#https://mirror.ccs.tencentyun.com/

腾讯云的主机可以使用上面的腾讯源,在内网拉镜像的速度非常快。不过还需要注意阿里源貌似没有arm镜像,我在家里的树莓派上用阿里源pull的镜像跑不起来,查日志的时候看到format error瞬间理解了。

基本使用

pod

1
kubectl run nginx --image=nginx

或者使用配置文件创建:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

然后执行kubectl apply -f pod.yaml就能创建一个pod

deployment

创建

1
kubectl create deploy nginx --image=nginx

使用配置文件创建

 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
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: src
      volumes:
      - name: src
        hostPath:
          path: /path/to/your/src

这里创建的deployment会对应3个pod,一般我们不直接创建pod,而是通过创建deployment的方式由deployment自动创建对应的pod。

进入容器

1
kubectl exec -it nginx -- bash

service

通过service暴露端口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - name: http
    port: 80
    targetPort: 80
  type: ClusterIP
  #type: LoadBalancer

端口的type设置为ClusterIP就是仅限集群内部访问,LoadBalancer就可以被外部访问。

ingress

创建ingress:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              name: http

通过ingress可以公开从集群外部到集群内服务的http和https路由,也就是说我有一个域名example.com,访问的时候会访问80端口,ingress根据Host转发给对应的service,再由service转发到对应的pod

部署SSl证书:

部署证书需要先创建一个secret:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: v1
kind: Secret
metadata:
  name: nginx-tls-secret
type: kubernetes.io/tls
data:
  tls.crt: |
    <base64 encoded tls.crt>    
  tls.key: |
    <base64 encoded tls.key>    

然后在ingress中使用这个secret

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
  - hosts:
      - example.com
    secretName: nginx-tls-secret
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              name: http
updatedupdated2023-05-262023-05-26