kubeadm安装k8s集群
操作系统:centos7.6
podSubnet(pod 网段) 10.244.0.0/16
serviceSubnet(service 网段): 10.10.0.0/16
集群角色 | IP | 主机名 | 安装组件 |
控制节点 | 192.168.53.100 | k8s-jy-master1 | apiserver、controller-manager、scheduler、etcd、kube-proxy、docker、calico |
工作节点 | 192.168.53.101 | k8s-jy-node1 | kubelet、kube-proxy、docker、calico、coredns |
工作节点 | 192.168.53.102 | k8s-jy-node2 | kubelet、kube-proxy、docker、calico、coredns |
说明:
kubeadm 是官方提供的开源工具,是一个开源项目,用于快速搭建 kubernetes 集群,目前是比较方便和推荐使用的。kubeadm init 以及kubeadm join 这两个命令可以快速创建 kubernetes 集群。Kubeadm 初始化 k8s,所有的组件都是以 pod 形式运行的,具备故障自恢复能力。
kubeadm 是工具,可以快速搭建集群,也就是相当于用程序脚本帮我们装好了集群,属于自动部署,简化部署操作,证书、组件资源清单文件都是自动创建的,自动部署屏蔽了很多细节,使得对各个模块感知很少,如果对 k8s 架构组件理解不深的话,遇到问题比较难排查。
kubeadm 适合需要经常部署 k8s,或者对自动化要求比较高的场景下使用。
1、初始化实验集群环境
1.1 配置主机名称
在 192.168.53.100 上执行如下:
hostnamectl set-hostname k8s-jy-master1 && bash
在 192.168.53.101 上执行如下:
hostnamectl set-hostname k8s-jy-node1 && bash
在 192.168.53.102 上执行如下:
hostnamectl set-hostname k8s-jy-node2 && bash
1.2 配置hosts文件
tee -a /etc/hosts <<EOF 192.168.53.100 k8s-jy-master1 192.168.53.101 k8s-jy-node1 192.168.53.101 k8s-jy-node1 EOF
1.3 配置主机免密登录
每台服务器都需要执行
# ssh-keygen # ssh-copy-id -i ~/.ssh/id_rsa.pub k8s-jy-master1 # ssh-copy-id -i ~/.ssh/id_rsa.pub k8s-jy-node1 # ssh-copy-id -i ~/.ssh/id_rsa.pub k8s-jy-node2
1.4 关闭swap分区,提高性能
临时关闭
swapoff -a
永久关闭
修改/etc/fstab 文件,注释swap一行(如果是克隆机需删除 UUID)
# sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
1.5 关闭防火墙、selinux安全机制
systemctl stop firewalld && systemctl disable firewalld setenforce 0 临时关闭selinux ##永久关闭selinux,修改/etc/selinux/config sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
1.6 修改服务器内核参数
# modprobe br_netfilter # echo "modprobe br_netfilter" >> /etc/profile # tee -a /etc/sysctl.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-arptables = 1 net.ipv4.ip_forward = 1 EOF # sysctl -p
1.7 配置阿里云的repo源
# cd /etc/yum.repos.d/ # mkdir bak # mv CentOS-Base.repo bak/ # curl -o /etc/yum.repos.d/Centos7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
配置docker的repo源
安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
# yum install -y yum-utils device-mapper-persistent-data lvm2 # yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 或者使用阿里云的docker源 (二选一即可) # yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装 epel 源
#安装官方epel源 # yum install -y epel-release #安装阿里的epel源 # wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo # yum clean all # yum makecache
配置安装k8s组件需要的阿里云的repo源
# cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=0 EOF
1.8 配置时间同步
# yum -y install ntpdate # ntpdate cn.pool.ntp.org 添加时间同步定时任务 crontab 设置时区为上海 # timedatectl set-timezone Asia/Shanghai
1.9 开启 ipvs
ipvs (IP Virtual Server) 实现了传输层负载均衡,也就是我们常说的 4 层 LAN 交换,作为 Linux内核的一部分。ipvs 运行在主机上,在真实服务器集群前充当负载均衡器。ipvs 可以将基于 TCP 和 UDP的服务请求转发到真实服务器上,并使真实服务器的服务在单个 IP 地址上显示为虚拟服务。
通过yum方式安装 # yum install -y ipvsadm 运行启动ipvsadm # ipvsadm 查看内核是否加载 # lsmod |grep ip_vs ip_vs 145497 0 nf_conntrack 133095 7 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_netlink,nf_conntrack_ipv4 libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack
1.10 安装基础软件包
# yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet ipvsadm
2、安装docker
2.1 安装docker-ce
# yum list docker-ce --showduplicates | sort -r # yum install -y docker-ce-20.10.6 docker-ce-cli-20.10.6 containerd.io # systemctl start docker && systemctl enable docker.service
2.2 配置docker镜像加速器和驱动
# tee /etc/docker/daemon.json <<EOF { "registry-mirrors": [ "https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com", "https://docker.m.daocloud.io", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com", "https://your_preferred_mirror", "https://dockerhub.icu", "https://docker.registry.cyou", "https://docker-cf.registry.cyou", "https://dockercf.jsdelivr.fyi", "https://docker.jsdelivr.fyi", "https://dockertest.jsdelivr.fyi", "https://mirror.aliyuncs.com", "https://dockerproxy.com", "https://mirror.baidubce.com", "https://docker.m.daocloud.io", "https://docker.nju.edu.cn", "https://docker.mirrors.sjtug.sjtu.edu.cn", "https://docker.mirrors.ustc.edu.cn", "https://mirror.iscas.ac.cn", "https://docker.rainbond.cc" ], "exec-opts": ["native.cgroupdriver=systemd"] } EOF # systemctl daemon-reload # systemctl restart docker
#修改 docker 文件驱动为 systemd,默认为 cgroupfs,kubelet 默认使用 systemd,两者必须一致才可以
3、安装 k8s 所需软件包
// apiVersion
policy/v1beta1 #是最早的 PDB API 版本,广泛用于 Kubernetes v1.5 到 v1.20
policy/v1 #是 PDB 的稳定版本,推荐在 Kubernetes v1.21 及更高版本中使用,另外v1.24 版本中彻底移除了对 Docker 的支持,安装前确定好版本
# yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6 # systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet
#上面可以看到 kubelet 状态不是 running 状态,这个是正常的,等 k8s 组件起来这个kubelet 就正常了。
4、kubeadm 初始化 k8s 集群
# kubeadm init \ --kubernetes-version=1.20.6 \ --apiserver-advertise-address=192.168.53.100 \ --image-repository registry.aliyuncs.com/google_containers \ --pod-network-cidr=10.244.0.0/16 \ --ignore-preflight-errors=SystemVerification
##如果镜像下载失败,可以执行以下命令查看 kubeadm 需要的镜像列表(手动拉取下来后打镜像tag):
kubeadm config images list --kubernetes-version=v1.21.0 --image-repository registry.aliyuncs.com/google_containers
显示如下说明安装完成:
kubeadm join 192.168.53.100:6443 --token t419t0.nfk1uvacbvuyk1f1 \
--discovery-token-ca-cert-hash sha256:381e529493649323bddd26e04bfb924cfbd9a2075e85ecaa973a4346142bf33e
## 上面这条命令是把 node 节点加入集群当中
##根据输出结果提示操作##
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
5、扩容k8s 集群,添加第一个工作节点
先将node1 加入集群当中
[root@k8s-jy-node1 ~]# kubeadm join 192.168.53.100:6443 --token t419t0.nfk1uvacbvuyk1f1 \ --discovery-token-ca-cert-hash sha256:381e529493649323bddd26e04bfb924cfbd9a2075e85ecaa973a4346142bf33e
# 上面输出说明 node1 节点已经加入集群充当工作节点了
# 在master 节点上执行 kubectl get nodes 查看
# 此时集群状态还是 NotReady 状态,因为没有安装网络插件
6、扩容k8s 集群,添加第二个工作节点
注:如果没有保存加入集群节点命令,可以在master 节点执行如下命令查看
kubeadm token create --print-join-command
输出如下:
在准备加入的节点上个执行此命令即可,然后主节点上查看
# 可以看到 node1、node2 的 ROLES 角色为空,<none>就表示这个节点是工作节点,可以给工作节点打个标签比如:worker
[root@k8s-jy-master1 ~]# kubectl label node k8s-jy-node1 node-role.kubernetes.io/worker=worker
[root@k8s-jy-master1 ~]# kubectl label node k8s-jy-node2 node-role.kubernetes.io/worker=worker
7、安装 kubernetes 网络组件-Calico
注:在线下载配置文件地址: https://docs.projectcalico.org/manifests/calico.yaml
[root@k8s-jy-master1 ~]# kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# STATUS 状态是 Ready,说明 k8s 集群正常运行了
8、测试在 k8s 创建 pod 是否可以正常访问网络
在工作节点上pull 一个busybox 镜像,本地下载好上传解压也可
# docker load < busybox-1-28.tar
[root@k8s-jy-master1 ~]# kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh
9、测试 coredns 是否正常
[root@k8s-jy-master1 ~]# kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh If you don't see a command prompt, try pressing enter. / # nslookup kubernetes.default.svc.cluster.local Server: 10.96.0.10 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Name: kubernetes.default.svc.cluster.local Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local / #
10、安装 k8s 可视化 UI 界面 dashboard
10.1 安装 dashboard
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc6/aio/deploy/recommended.yaml
修改recommended.yaml配置,如下:
[root@k8s-jy-master1 ~]# vim recommended.yaml ……………… kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: # 添加处 type: NodePort ports: - port: 443 targetPort: 8443 # 添加处 nodePort: 30001 selector: k8s-app: kubernetes-dashboard ……………… template: metadata: labels: k8s-app: kubernetes-dashboard spec: containers: - name: kubernetes-dashboard image: kubernetesui/dashboard:v2.0.0-rc6 # 修改处 从 Always 改为了 IfNotPresent #imagePullPolicy: Always imagePullPolicy: IfNotPresent ……………… spec: containers: - name: dashboard-metrics-scraper image: kubernetesui/metrics-scraper:v1.0.3 # 添加如下行 imagePullPolicy: IfNotPresent
# 启动dashboard
[root@k8s-jy-master1 ~]# kubectl apply -f recommended.yaml
# 查看dashboard 状态
[root@k8s-jy-master1 ~]# kubectl get po -n kubernetes-dashboard NAME READY STATUS RESTARTS AGE dashboard-metrics-scraper-74db988864-85jmk 1/1 Running 0 92s kubernetes-dashboard-847d8c7cdc-qc5bt 1/1 Running 0 92s
# 查看 dashboard 前端的 service
[root@k8s-jy-master1 pki]# kubectl get services --all-namespaces NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d7h kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 2d7h kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.99.197.211 <none> 8000/TCP 16m kubernetes-dashboard kubernetes-dashboard NodePort 10.111.33.241 <none> 443:30001/TCP 16m
# 浏览器访问: https://192.168.53.100:30001
# 使用令牌登录(需要创建能够访问 Dashboard 的用户)
[root@k8s-jy-master1 ~]# cat account.yaml # Create Service Account apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kube-system --- # Create ClusterRoleBinding 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: kube-system [root@k8s-jy-master1 ~]# kubectl apply -f account.yaml serviceaccount/admin-user created clusterrolebinding.rbac.authorization.k8s.io/admin-user created
# 查看 kubernetes-dashboard 名称空间下的 secret
[root@k8s-jy-master1 pki]# kubectl get secret -n kubernetes-dashboard NAME TYPE DATA AGE default-token-ldksl kubernetes.io/service-account-token 3 22m kubernetes-dashboard-certs Opaque 0 22m kubernetes-dashboard-csrf Opaque 1 22m kubernetes-dashboard-key-holder Opaque 2 22m kubernetes-dashboard-token-rpn5m kubernetes.io/service-account-token 3 22m
# 查看绑定信息(注意有admin-user)
[root@k8s-jy-master1 ~]# kubectl get clusterrolebinding NAME ROLE AGE admin-user ClusterRole/cluster-admin 17m calico-kube-controllers ClusterRole/calico-kube-controllers 2d7h calico-node ClusterRole/calico-node 2d7h ......
# 获取tocken
[root@k8s-jy-master1 ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') Name: admin-user-token-rgrf6 Namespace: kube-system Labels: <none> Annotations: kubernetes.io/service-account.name: admin-user kubernetes.io/service-account.uid: d36a1bf3-ed79-4129-a38e-cc880838006b Type: kubernetes.io/service-account-token Data ==== namespace: 11 bytes token: eyJhbGciOiJSUzI1NiIsImtpZCI6Im1NTG1xZlVNWnJUd19iMkJGUXRzMzBjZVZESEJzZGFHTTFfenozOGpyWEkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXJncmY2Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJkMzZhMWJmMy1lZDc5LTQxMjktYTM4ZS1jYzg4MDgzODAwNmIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.jphydqNnjCdzQ2crvCbP4mvKLxIdydf-elgOu9iTevxGzXZUEKnIKFWeuUIUg9Tknk56z3IsNA8qWQJMW9ykJ5ilvE1WgnKH9rRRhmnpTZpfdO_4_FH2hHm6nStKsCYXRMDvGJD4DteDOBz6fYRKIlwQ7dNfjz1PYmd6HYCPuuxmURdTn5-Pa1F1VJGqicpuepXusPaCpqTJGMd0ELmp8kYFiPgnMzpyq7EDZPb942i6JtD7UJXkaFcZyNHh8OmNiYe1SZVdjBmPJCKOxpRFih73KDn3oGeL3b1jUbvUJTJkpCB7TBK7a-w6qPbWoH3pehzpNLVd_95iWtlwsjovyg ca.crt: 1066 bytes
# 将得到的token信息用于访问,结果如下:
10.2 通过 kubeconfig 文件访问 dashboard
# 创建 cluster 集群
[root@k8s-jy-master1 kubernetes]# cd pki/ [root@k8s-jy-master1 pki]# kubectl config set-cluster kubernetes --certificate-authority=./ca.crt --server="https://192.168.53.100:6443" --embed-certs=true --kubeconfig=/root/dashboard-admin.conf
# 创建 credentials
创建 credentials 需要使用上面的 kubernetes-dashboard-token-rpn5m 对应的 token 信息
[root@k8s-jy-master1 ~]# kubectl get secret -n kube-system NAME TYPE DATA AGE admin-user-token-rgrf6 kubernetes.io/service-account-token 3 50m attachdetach-controller-token-c44rp kubernetes.io/service-account-token 3 2d8h bootstrap-signer-token-8m6wf kubernetes.io/service-account-token 3 2d8h calico-kube-controllers-token-9bjr8 kubernetes.io/service-account-token 3 2d7h ................ [root@k8s-jy-master1 ~]# DEF_NS_ADMIN_TOKEN=$(kubectl get secrets admin-user-token-rgrf6 -n kube-system -o jsonpath={.data.token}|base64 -d) [root@k8s-jy-master1 ~]# kubectl config set-credentials dashboard-admin --token=$DEF_NS_ADMIN_TOKEN --kubeconfig=/root/dashboard-admin.conf
# 创建 context
[root@k8s-jy-master1 pki]# kubectl config set-context dashboard-admin@kubernetes --cluster=kubernetes --user=dashboard-admin --kubeconfig=/root/dashboard-admin.conf
# 切换 context 的 current-context 是 dashboard-admin@kubernetes
[root@k8s-jy-master1 pki]# kubectl config use-context dashboard-admin@kubernetes --kubeconfig=/root/dashboard-admin.conf
# 把刚才的 kubeconfig 文件 dashboard-admin.conf 复制到桌面
浏览器访问时使用 kubeconfig 认证,把刚才的 dashboard-admin.conf 导入到 web 界面,那么就可以登陆了
10.3 通过 kubernetes-dashboard 创建容器
deploy 即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了