Kubernetes (K8S) 搭建教程

一、安装 Docker


由于常用软件源中的 docker 都比较老了,所以需要添加 docker-ce 的源

APT(Ubuntu)

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
37
38
# 设置仓库
# 安装软件包以允许 apt 通过 HTTPS 使用存储库
apt-get update && apt-get install \
apt-transport-https ca-certificates curl software-properties-common

# 新增 Docker 的 官方 GPG 秘钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

# 添加 Docker apt 仓库
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"

# 安装 Docker CE
apt-get update && apt-get install \
containerd.io \
docker-ce \
docker-ce-cli -y

# 设置 daemon
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF

mkdir -p /etc/systemd/system/docker.service.d

# 重启 docker.
systemctl daemon-reload
systemctl restart docker

YUM(CentOS)

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
# 设置仓库
# 安装软件包以允许 apt 通过 HTTPS 使用存储库
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

# 安装 Docker CE
yum install docker-ce docker-ce-cli containerd.io

# 设置 cgroup 驱动
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF

# 重启 docker.
systemctl daemon-reload
systemctl restart docker

二、安装 K8S


APT

1
2
3
4
5
6
7
8
9
10
11
12
13
apt-get update && apt-get install -y apt-transport-https

curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

swapoff -a
# use "free -m" to see if we successfully unable the swap
free -m

apt-get update
apt-get install -y kubelet kubeadm kubectl

YUM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

三、配置 K8S


1. 配置代理或阿里云的源

由于 gcp 仓库被国内限制了访问,因此需配置代理或使用阿里云的源,这里建议配置代理,因为阿里云的源不是很全。

使用代理

需自身拥有代理服务器,具体操作请自行查找

使用vry客户端的安装脚本进行安装,并将配置文件放到 /usr/local/etc/v2ray/config.json 中。

然后配置 docker 使用代理:

1
2
3
4
5
6
7
8
vim /etc/systemd/system/docker.service.d/proxy.conf

[Service]
Environment="HTTPS_PROXY=socks5://127.0.0.1:10808"
Environment="HTTP_PROXY=socks5://127.0.0.1:10808"

systemctl daemon-reload
systemctl restart docker

使用阿里云镜像

1
2
3
4
5
6
7
8
# 运行以下脚本

for i in `kubeadm config images list`; do
imageName=${i#k8s.gcr.io/}
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;

2. Master 节点

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
cat <<EOF > kubeadm-config.yaml
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta2
kubernetesVersion: <替换为自己的版本>
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
EOF

kubeadm init --apiserver-advertise-address=<替换为主节点ip> --pod-network-cidr=10.244.0.0/16 --service-cidr=10.244.0.0/12 --config kubeadm-config.yaml --v=5
# --apiserver-advertise-address: 指定master服务发布的ip地址
# --pod-network-cidr: 指定pod网络的IP地址范围
# --service-cidr: 指定service网络的IP地址范围
# --v=5: 展示运行细节
#
# 其输出结果中会包含一个 kubeadm join ... 的命令,记得保存以方便从节点加入

export KUBECONFIG=/etc/kubernetes/admin.conf

# 安装网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 控制平面节点隔离。默认情况下,出于安全原因,群集不会在控制平面节点上调度 Pod。如果希望能够在控制平面节点上安排 Pod,例如对于用于开发的单机 Kubernetes 群集,请运行:
kubectl taint nodes --all node-role.kubernetes.io/master-

# 查看所有节点信息
kubectl get nodes

3. Salve 节点

1
2
3
# 使用 master 节点初始化时输出的代码
kubeadm join 10.42.**.**:6443 --token 0v4nx2.k450c9ak934uzqzw \
--discovery-token-ca-cert-hash sha256:12852a78ea3ea66d743daff4e4b95d53e8adc9e8a5a57251c62b8242fc51f4b0

四、安装 Helm

1. Helm 用途

Helm 是用于 kubernetes 的包管理工具,可以帮助我们快速的构建 kubernetes 应用,它包含以下几个部分:

  • Chart: 一个Helm包,其中包含了运行一个应用所需要的镜像、依赖和资源定义等,还可能包含Kubernetes集群中的服务定义

可以理解为docker的image

  • Release: 在Kubernetes集群上运行的 Chart的一个实例。在同一个集群上,一个 Chart可以安装很多次。每次安装都会创建一个新的releas

可以理解为docker的container实例

  • Repository: 用于发布和存储 Chart 的仓库。

2. Helm 安装

首先前往 https://github.com/helm/helm/releases 查看 Helm 版本信息,然后选择其中一个版本,这里以 3.6.3 为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
wge thttps://get.helm.sh/helm-v3.6.3-linux-amd64.tar.gz

# 解压
tar -zxvf helm-v3.6.3-linux-amd64.tar.gz

# 进入到解压后的目录
cd linux-amd64/

# 赋予权限
chmod a+x /usr/local/bin/helm

# 查看版本
helm version

五、 安装 K8S Dashboard

该部分参考了教程 https://www.cnblogs.com/baoshu/p/13326480.html

1. 准备工作

这里将使用 Helm 进行 Dashboard 的安装,同时需要提前在 Kubernetes 中安装一个 Ingress 来帮助容器进行反向代理,不然 Kubernetes 外部不能访问到容器内。

Ingress 的安装可以参考https://www.cnblogs.com/baoshu/p/13255909.html#head16

同时配置 Ingress 和 Dashboard 还需要一个域名和对应的 HTTTPS 证书,被根据证书生成 secret。

免费域名 freenom.com,免费证书 ZeroSSL

1
2
3
4
5
6
7
8
# 这里假设证书已经上传至路径/usr/local/cert

cd /usr/local/cert

# 创建secret到kube-system命名空间下
# 之后我们的dashboard也会创建在这个命名空间下,需要依赖这个,所以提前创建
kubectl creat secret tls dashboard-tls --key aaa.key --cert bbb.crt -n kube-system

2. 安装

拉取安装配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 添加helmhub上的dashboard官方repo仓库
helm repo add kubernetes-dashboard <https://kubernetes.github.io/dashboard/>

# 查看添加完成后的仓库
helm repo list

# 查询dashboard的chart
helm search repo kubernetes-dashboard

# 新建文件夹用于保存chart
mkdir dashboard-chart && cd dashboard-chart

# 拉取chart
helm pull kubernetes-dashboard/kubernetes-dashboard

# 此时会有一个压缩包,解压它
tar -zxvf kubernetes-dashboard-2.3.0.tgz

# 进入到解压后的文件夹
cd kubernetes-dashboard

修改配置

根据 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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
image:
repository: kubernetesui/dashboard
tag: v2.0.3
pullPolicy: IfNotPresent
pullSecrets: []
replicaCount: 1
annotations: {}
labels: {}
extraEnv: []
podAnnotations:
seccomp.security.alpha.kubernetes.io/pod: 'runtime/default'
nodeSelector: {}
tolerations: []
affinity: {}

resources:
requests:
cpu: 100m
memory: 200Mi
limits:
cpu: 2
memory: 200Mi
protocolHttp: false

service:
type: ClusterIP
externalPort: 443
annotations: {}
labels: {}

ingress:
enabled: true
annotations:
nginx.ingress.kubernetes.io/secure-backends: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
paths:
- /
customPaths: []
hosts:
- xxx.xxx.com # 你的域名
tls:
# 注意这个名字要跟前面新建的secret对上
- secretName: dashboard-tls
hosts:
- xxx.xxx.com # 你的域名

metricsScraper:
enabled: false
image:
repository: kubernetesui/metrics-scraper
tag: v1.0.4
resources: {}
containerSecurityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsUser: 1001
runAsGroup: 2001

metrics-server:
enabled: false

rbac:
create: true
clusterRoleMetrics: true
clusterReadOnlyRole: false

serviceAccount:
create: true
name:

livenessProbe:
initialDelaySeconds: 30
timeoutSeconds: 30

podDisruptionBudget:
enabled: false
minAvailable:
maxUnavailable:

containerSecurityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsUser: 1001
runAsGroup: 2001

networkPolicy:
enabled: false

根据配置进行构建

1
2
# 执行路径在new-values.yaml目录
helm install -f new-values.yaml --namespace kube-system kubernetes-dashboard .

查看 Token 并登录

1
2
3
4
5
6
7
# 获取 token 名称
kubectl get secret -n kube-system | grep kubernetes-dashboard-token
# 返回 kubernetes-dashboard-token-vgp9w kubernetes.io/service-account-token 3 22h

# 获取 token 值
kubectl describe secret kubernetes-dashboard-token-vgp9w -n kube-system

之后便可以访问你的域名,并使用这个 token 进行登录。

注意需要修改你的域名的解析信息

为账户授权

当我们登录进去后,会发现看不到什么资源,这是因为账户权限不够,所以需要授权,这里直接赋予了 admin 权限。

  1. 创建dashboard-admin.yaml,内容为以下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kube-system

  1. 应用资源文件dashboard-admin.yaml
1
kubectl apply -f dashboard-admin.yaml

之后再登录就可以看到资源信息了。