操作系统: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-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

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 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镜像加速器和驱动

# mkdir -p /etc/docker
# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://9dxgnq38.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# systemctl daemon-reload
# systemctl restart docker

#修改 docker 文件驱动为 systemd,默认为 cgroupfs,kubelet 默认使用 systemd,两者必须一致才可以

3、安装 k8s 所需软件包

# 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 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

输出如下:

在准备加入的节点上个执行此命令即可,然后主节点上查看

# 可以看到 xianchaonode1、xianchaonode2 的 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 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 即可

kubeadm安装单master单node节点k8s集群的更多相关文章

  1. Centos7使用kubeadm安装1.23.1版本的k8s集群

    系统环境 #cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) #Linux内核一定要大约等于3.10,也就是centos版本要大 ...

  2. rancher三节点k8s集群部署例子

    rancher三节点k8s集群部署例子 待办 https://rorschachchan.github.io/2019/07/25/使用Rancher2-1部署k8s/

  3. K8S踩坑篇-master节点作为node节点加入集群

    前面我们二进制部署K8S集群时,三台master节点仅仅作为集群管理节点,所以master节点上中并未部署docker.kubelet.kube-proxy等服务.后来我在部署mertics-serv ...

  4. hyper-v虚拟机上的centos多节点k8s集群实践

    之前体验了minikube,掉深坑里至今还没有爬出来,玩单节点用minikube够了, 但傻瓜试的安装让人对k8s理解不是很深刻(坑),而且多节点好像有什么奇怪的问题 所以我这次要用两个虚拟机来模拟k ...

  5. 轻量化安装 TKEStack:让已有 K8s 集群拥有企业级容器云平台的能力

    关于我们 更多关于云原生的案例和知识,可关注同名[腾讯云原生]公众号~ 福利: ①公众号后台回复[手册],可获得<腾讯云原生路线图手册>&<腾讯云原生最佳实践>~ ②公 ...

  6. 使用Rancher Server部署本地多节点K8S集群

    当我第一次开始我的Kubernetes之旅时,我一直在寻找一种设置本地部署环境的方式.很多人常常会使用minikube或microk8s,这两者非常适合新手在单节点集群环境下进行操作.但当我已经了解了 ...

  7. 仅需60秒,使用k3s创建一个多节点K8S集群!

    作者: Dawid Ziolkowski丨Container Solution云原生工程师 最近,我一直在Kubernetes上进行各种测试和部署.因此,我不得不一次又一次创建和销毁Kubernete ...

  8. 一键安装基于dns的高可用k8s集群(3节点,etcd https)

    在公司,使用dns切换,可能会比keepalived+haproxy,更精简的易维护. 毕竟,高可用只是偶尔切换,不是时时切换. 且dns解析在自己可控时,更不会影响k8s线上使用了. (部分代码,由 ...

  9. Kubernetes : 多节点 k8s 集群实践

    说明: 本文参考 『 Kubernetes 权威指南 』 第一章的案例. 需要说明的是, 这本书里有很多描述的东西和实践的案例不吻合. Kubernets 集群架构 架构图 Server List 节 ...

  10. 超强教程!在树莓派上构建多节点K8S集群!

    在很长一段时间里,我对于在树莓派上搭建Kubernetes集群极为感兴趣.在网络上找到一些教程并且跟着实操,我已经能够将Kubernetes安装在树莓派上,并在三个Pi集群中工作.然而,在master ...

随机推荐

  1. TensorFlow中的Variable 变量

    简单运用 这节课我们学习如何在 Tensorflow 中使用 Variable . 在 Tensorflow 中,定义了某字符串是变量,它才是变量,这一点是与 Python 所不同的. 定义语法: s ...

  2. css实现水波纹

    携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情 ui设计的元素有时候需要有一些动画效果,可以直接用css动画来实现. 实现一个中心圆向四周有水波纹的效果 ...

  3. cisco的telnet远程登入

    Cisco配置telnet登入 拓扑图: IP地址表: 设备 IP地址 PC0 192.168.1.1 Switch0 vlan1:192.168.1.254 1.不需要用户的telnet登入 Swi ...

  4. 只要引用这个js就会页面加载完毕自动弹出提示框

    IE浏览器不支持ES6语法, 此代码为翻译并修改过的,使用的bable网站翻译 (function (win) { // 生成遮罩和弹出层,返回弹出层DOM对象 var createMsgBox = ...

  5. 《CSOL大灾变》Mobile开发记录——武器音效部分

    在前端时间开发了武器系统的大部分逻辑,从武器购买界面,武器购买逻辑到游戏逻辑(拾起和丢弃武器)等都开发得差不多了.剩下的仅仅只是增加武器数据(模型,动画和音效,特效等等),然后用统一脚本逻辑定义载入游 ...

  6. C# 实时显示时间

    c#实时显示时间 - vv彭 - 博客园 (cnblogs.com)

  7. Thread记录

    项目用到了线程 所以写出来留作以后复习线程Thread类包含在System.Threading命名空间有关线程的操作主要包含在这个类中现在总结一下Thread的常用方法和属性 Start([参数])/ ...

  8. 基于北斗gps设计的NTP网络时间服务器

    基于北斗gps设计的NTP网络时间服务器 基于北斗gps设计的NTP网络时间服务器 京准电子科技官微--ahjzsz 随着5G等新型基础设施持续建设和发展,在未来万物互联的庞大信息网络中,跨路由节点之 ...

  9. 加密算法和hash

    随着安全问题越来越被重视,公司也全面替换了HTTP为HTTPS.2015年iOS9的ATS到今年苹果更是放出话来,2017年全面支持HTTPS,不支持的App,在审核的时候可能会遇到麻烦.鉴于此,我有 ...

  10. git远程分支回退到某个版本

    1.找到要回退的版本号(右击项目--> Git --> Show History -->选中要回退的版本-->Copy Revision Number): 2.打开idea的T ...