Kubernetes (K8S) 搭建教程
Kubernetes (K8S) 搭建教程

Kubernetes (K8S) 搭建教程

Created
Jul 31, 2021 05:38 PM
Tags
Cloud
Category
云计算
Last Edited
Last updated July 15, 2022
Abstract
本文主要介绍了常见 Linux 发行版本上安装 K8S 的方案。
Related to Reading List (Column)

一、安装 Docker


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

APT(Ubuntu)

# 设置仓库 # 安装软件包以允许 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)

# 设置仓库 # 安装软件包以允许 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

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

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 仓库被国内限制了访问,因此需配置代理或使用阿里云的源,这里建议配置代理,因为阿里云的源不是很全。

使用代理

需自身拥有代理服务器,具体操作请自行查找
使用v*r*y客户端的安装脚本进行安装,并将配置文件放到 /usr/local/etc/v2ray/config.json 中。
然后配置 docker 使用代理:
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

使用阿里云镜像

# 运行以下脚本 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 节点

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 节点

# 使用 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 为例
notion image
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
# 这里假设证书已经上传至路径/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. 安装

拉取安装配置

# 添加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 复制出一份新的文件,并对其进行修改
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

根据配置进行构建

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

查看 Token 并登录

# 获取 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 进行登录。
注意需要修改你的域名的解析信息
notion image

为账户授权

当我们登录进去后,会发现看不到什么资源,这是因为账户权限不够,所以需要授权,这里直接赋予了 admin 权限。
  1. 创建dashboard-admin.yaml,内容为以下
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
kubectl apply -f dashboard-admin.yaml
之后再登录就可以看到资源信息了。