云原生入门之k8s:部署集群

70 阅读3分钟

在学习docker的时候我们说到,docker的使用标志着进入容器化时代,但随之也产生了许多问题:

  1. 如何协调和调度这些容器?
  2. 如何保证升级应用时不会中断服务的提供?
  3. 如何监控容器的运行状况?
  4. 如何批量操作容器中的应用?
  5. ……

解决这些问题所需要的就是容器编排技术,k8s是当前流行的大规模容器编排系统。

  • 服务发现和负载均衡。使用DNS名称或ip地址公开容器,k8s可以负载均衡并分配网络流量。
  • 存储编排。允许自动挂载所选择的存储系统,如本地存储、公共云提供商等。
  • 自动部署和回滚。可以自动化k8s创建新容、删除现有容器并将资源用于新容器
  • 自动装箱计算。k8s可以管理容器所需的cpu和内存(RAM)
  • 自我修复。
  • 密钥和配置管理。k8s允许存储和管理敏感信息,可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,无需在堆栈配置中暴露密钥。 k8s提供了弹性运行分布式系统框架,满足扩展要求、故障转移、部署模式等。

架构

kubernetes.io/docs/concep…

image.png

集群部署

k8s的集群创建需要最少三台机器,我在阿里云购买了三台centos服务器,对于服务器有以下要求。

  • 2cpu或更多
  • 2GB或更多RAM
  • 机器间可以互相通信、不能有重复的主机名、mac地址
  • 禁用交换分区

对于三台服务器,创建了网段为171.31.0.0/16的专用网络,和网段为171.31.0.0/24的交换机,并让三台服务器位于该专用网络和交换机下。

以下命令默认在所有机器中都要执行

1. 安装kubeadm

  1. 配置基础环境
#各个机器设置自己的域名
hostnamectl set-hostname xxxx
# 刷新,显示主机名
bash

# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

#关闭swap
swapoff -a  
sed -ri 's/.*swap.*/#&/' /etc/fstab

#允许 iptables 检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
  1. 安装kubectl、kubelet、kubeadm
# 配置yum源
cat <<EOF | sudo tee /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
exclude=kubelet kubeadm kubectl
EOF

# 下载指定版本
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes

sudo systemctl enable --now kubelet

kubelet每隔几秒会重启,使用systemctl status kubelet查看时状态可能是inactive也可能是active,因为它陷入了等待kubeadm指令的死循环。

2. 使用kubeadm引导集群

  1. 下载镜像
sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF

# 执行该命令行需要下载docker环境,可以参考https://zerlina-ysl.github.io/posts/blog/devops_docker/
chmod +x ./images.sh && ./images.sh
  1. 初始化master节点
# 所有机器添加master域名映射,需要修改为自己的master节点的私有ip,设置该ip机器为集群入口节点
echo "171.31.0.86  cluster-endpoint" >> /etc/hosts
# 执行后各节点执行ping命令,能ping通即配置成功
ping cluster-endpoint```
**以下命令只在主节点中运行**
```shell
# 同理,第一个addr是master的私有ip
kubeadm init \
--apiserver-advertise-address=171.31.0.86 \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \ # service的ip范围
--pod-network-cidr=192.168.0.0/16 # pod的ip范围
#所有网络范围不重叠

# 主节点初始化成功后会返回以下指令,需要保留
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

  kubeadm join cluster-endpoint:6443 --token 7okoz9.ti7losttdfw118hi \
    --discovery-token-ca-cert-hash sha256:92dad63ae98727291c666b048098178e19c9b1584f560283fe2b5d8e9613a941 \
    --control-plane 

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join cluster-endpoint:6443 --token 7okoz9.ti7losttdfw118hi \
    --discovery-token-ca-cert-hash sha256:92dad63ae98727291c666b048098178e19c9b1584f560283fe2b5d8e9613a941

分析以上返回信息,需要执行以下操作(⚠️,仍是只在主节点运行): 2.1 开启容器的运行

mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

2.2 部署网络插件

运行后主节点初始化成功,但是kubectl get nodes后状态仍是not ready,此时还需要安装一个网络插件,根据提示的网址kubernetes.io/docs/concep… 选择安装calico插件,注意安装的calico的版本

curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O

# 运行后生成.yaml文件,根据配置文件为集群创建资源
kubectl apply -f calico.yaml

# 查询此时集群中的所有应用(Pod)
kubectl get pod -A

此时重新运行kubectl get nodes,主节点的状态已变为ready。

  1. 集群中加入node节点(⚠️:在除了主节点的其他节点中运行)
    以下命令只在24h内有效,但是过期可以在主节点使用kubeadm token create --print-join-command创建新的令牌,将返回结果重新在从节点运行即可。
kubeadm join cluster-endpoint:6443 --token 7okoz9.ti7losttdfw118hi \
    --discovery-token-ca-cert-hash sha256:92dad63ae98727291c666b048098178e19c9b1584f560283fe2b5d8e9613a941

返回"This node has joined the cluster:",表明节点加入集群成功。
此时在主节点执行kubectl get nodes,可以看到集群中节点情况。此时集群部署成功。 getNodes.png 4. 验证kubernetes的集群能力 reboot重启三台机器,查看集群状态,会发现k8s集群状态不受影响,这是因为集群的自我修复能力。 4. 安装dashboard可视化界面

[github.com/kubernetes/…

# 运行远程配置文件,安装可视化工具
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
# 设置访问端口,将配置文件中spec.type的value设置为 NodePort
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
# 找到端口
kubectl get svc -A |grep kubernetes-dashboard

会生成一个超过3万的端口号。对于32427,就是访问可视化界面的端口,需要在安全组放行。之后可以使用集群中任一机器的公网ip地址+32427,就可以访问可视化界面。
创建dash-usr.yaml,粘贴内容。

#创建访问账号,准备一个yaml文件; vi dash-usr.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

kubectl apply -f dash-usr.yaml,应用配置文件,创建访问账号。

#获取访问令牌
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
# 以下是返回的内容,就是访问可视化dashboard的token
eyJhbGciOiJSUzI1NiIsImtpZCI6IkstSF9iTUlCaTVNNFVTVW5CZVVJYzh0WjA1QlRuMERELXpRRW5xUFZrNEkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXdjNHZ4Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJmZGNhZDgzMy01ZmUzLTQzYjAtYjU5NC1lNTlkNGYwZjhhNzAiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.dTI-mL9SuaTU-NCSjNsXCJ5BKdaye5NLocY47FMPzEJY6OPuhIdAuk7WXEA5o6AVSncWP55fG2s55WEn1dlU-nj90a2A6RkRHGwubiH761GSkDqg3GV7tKVCyzSA_-UDzu0VbdZVbPITYFNDUSIayKyOjRPUHW0IxvQzY2CRkWF4Dt0OvmmWANe-yqlAecSegEfizx08_KVxkYmtRUpGrD4KFqAzg9RiP6qtymOUEDkoxIP6qaZtD6bJ6No14ZaEM142cGvUSQoZfetMq0OjLqEHXLkVQem8d84cTBYlRu606SIdFowD4NafdNXFdH6N3en0PEK_LofWABxca7ogkA

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 23 天,点击查看活动详情