前言
大四的时候上了一门软件工程实训课,需要使用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
|