目录
- kubeadm概述
- 安装要求
- 准备环境
- 安装kubelet、kubeadm、kubectl
- 使用kubeadm引导集群
- 下载各个机器需要的镜像
- 初始化主节点
- 安装网络组件
- 常用shell命令
- 测试kubernetes集群
- 部署dashboard
kubeadm概述
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。
这个工具能通过两条指令完成一个kubernetes集群的部署:
# 创建一个 Master 节点
$ kubeadm init
# 将一个 Node 节点加入到当前集群中
$ kubeadm join <Master节点的IP和端口 >
安装要求
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
- 一台或多台机器,操作系统 CentOS7.x-86_x64
- 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
- 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
- 禁止swap分区
准备环境
角色 | IP |
---|---|
k8smaster | 192.168.80.100 |
k8snode1 | 192.168.80.101 |
所有机器都要执行如下操作
#各个机器设置自己的域名
hostnamectl set-hostname xxxx
# 将 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
安装kubelet、kubeadm、kubectl
kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环
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 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环
使用kubeadm引导集群
下载各个机器需要的镜像
下载镜像较多,使用脚本一次运行自动下载
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
chmod +x ./images.sh && ./images.sh
初始化主节点
#所有机器添加master域名映射,以下需要修改为自己的
echo "192.168.80.100 k8smaster" >> /etc/hosts
# 主节点初始化
# --apiserver-advertise-address:用于指定kube-apiserver监听的ip地址,就是master本机IP地址
# --control-plane-endpoint: 主节点的域名
# --pod-network-cidr:用于指定pod的网络范围
# --service-cidr:用于指定SVC的网络范围
#所有网络范围不重叠
kubeadm init \
--apiserver-advertise-address=192.168.80.100 \
--control-plane-endpoint=k8smaster \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.172.0.0/16
执行命令之后等待完成,master成功后提示如下
根据提示继续执行命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 如果需要master添加到k8s里执行这个
kubeadm join k8smaster:6443 \
--token kjv1vv.puk52v8h9mrnqvbu \
--discovery-token-ca-cert-hash sha256:6a9ee1c650f71bec764664e6a9dece4ae020645d5b3b893167da4794fe7d4586 \
--control-plane
# 如果需要node添加到k8s里执行这个
kubeadm join k8smaster:6443 \
--token kjv1vv.puk52v8h9mrnqvbu \
--discovery-token-ca-cert-hash sha256:6a9ee1c650f71bec764664e6a9dece4ae020645d5b3b893167da4794fe7d4586 \
--control-plane
安装网络组件
curl https://docs.projectcalico.org/manifests/calico.yaml -O
# 查看IP网段是否是kubeadm init的 --pod-network-cidr网络范围 如果不是需要修改
cat calico.yaml |grep 192
kubectl apply -f calico.yaml
常用shell命令
#查看集群所有节点
kubectl get nodes
#根据配置文件,给集群创建资源
kubectl apply -f xxxx.yaml
#查看集群部署了哪些应用?
docker ps === kubectl get pods -A
# 实时查看
docker ps === kubectl get pods -A -w
# watch每一秒刷新一次
watch -n 1 kubectl get pods -A
# 运行中的应用在docker里面叫容器,在k8s里面叫Pod
kubectl get pods -A
# 生成新令牌
kubeadm token create --print-join-command
测试kubernetes集群
在Kubernetes集群中创建一个pod,验证是否正常运行:
$ kubectl create deployment nginx --image=nginx
$ kubectl expose deployment nginx --port=80 --type=NodePort
$ kubectl get pod,svc
访问地址:http://NodeIP:Port
部署dashboard
部署
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
kubectl apply -f recommended.yaml
设置访问端口
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
ClusterIP 改为 type: NodePort
找到dashboard端口
kubectl get svc -A |grep kubernetes-dashboard
访问: https://集群任意IP:端口 https://k8snode1:32759
创建访问账号
#创建访问账号,准备一个yaml文件; vi dash.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.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}}"
界面