如何快速搭建Kubernetes实验环境?

云计算
如果kubelet本身就是运行在一个容器里,那么直接操作宿主机就会变的很麻烦,所以为了解决这个问题,kubeadm选择直接将kubelet部署在宿主机上,然后使用容器部署其他组件。

[[411640]]

很多小伙伴想学kubernetes,都会遇到这些问题

  • 手里没有可用的服务器
  • 打开kubernetes官方文档,看到复杂的组件学不下去

今天就介绍一种省钱省时的方式来玩kubernetes

准备服务器

很多小伙伴电脑配置比较高,可以直接用虚拟机开两台机器,至少得确保自己的电脑16G内存以上

我一个穷鬼,用着8G内存小本,没办法,我选择云服务器

在阿里云平台充值100块,选择按量付费,每小时3毛钱的2c4G突发性能实例,玩一晚上也就一罐红牛的价格

服务器开好就可以开始部署kubernetes了,本文采用kubeadm方式快速搭建kubernetes集群

修改系统参数

  • 加载br_netfilter模块
查看是否加载br_netfilter 
lsmod | grep br_netfilter 
加载br_netfilter 
modprobe br_netfilter 
或者修改module-load文件 
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf 
br_netfilter 
EOF 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 开启iptables检查桥接流量
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.
  • 2.
  • 3.
  • 4.
  • 5.
  • 关闭swap
swapoff -a 
  • 1.
  • 关闭防火墙及selinux
systemctl stop firewalld && systemctl disable firewalld 
setenforce 0 
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config 
  • 1.
  • 2.
  • 3.
  • 设置主机名
master: hostnamectl set-hostname k8s-master 
node: hostnamectl set-hostname k8s-node01 
  • 1.
  • 2.
  • 添加host
cat >> /etc/hosts << EOF 
192.168.4.34 k8s-master 
192.168.4.35 k8s-node01 
EOF 
  • 1.
  • 2.
  • 3.
  • 4.
  • 设置时钟同步,用ntpdate或chronyd
yum -y install epel-release chrony && systemctl enable chronyd && systemctl start chronyd 
  • 1.

安装docker

# 配置docker-ce的yum源 
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo 
# 安装docker-ce 
yum -y install docker-ce 
# 设置开机自启动并启动docker 
systemctl enable docker && systemctl start docker 
# 查看docker版本 
docker version 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

配置kubernetes的yum源

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 
repo_gpgcheck=0 
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg 
EOF 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

安装kubeadm、kubelet、kubectl

yum -y install kubeadm kubelet kubectl 
systemctl enable kubelet 
  • 1.
  • 2.

kubelet是kubernetes项目用来操作Docker等容器运行时的核心组件,在每个节点上都存在,可以说除了跟容器运行时打交道外,kubelet在配置容器网络、管理容器数据卷时,他都需要直接操作宿主机

如果kubelet本身就是运行在一个容器里,那么直接操作宿主机就会变的很麻烦,所以为了解决这个问题,kubeadm选择直接将kubelet部署在宿主机上,然后使用容器部署其他组件

部署kubernetes Master

kubeadm init \ 
--apiserver-advertise-address=172.22.29.78 \ 
--image-repository registry.aliyuncs.com/google_containers \ 
--kubernetes-version v1.21.2 \ 
--service-cidr=10.1.0.0/16 \ 
--pod-network-cidr=10.244.0.0/16 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

提示coredns:v1.8.0不存在,解决办法:

# 添加docker加速器 
tee /etc/docker/daemon.json <<-'EOF' 

  "registry-mirrors": ["https://fl791z1h.mirror.aliyuncs.com"

EOF 
systemctl daemon-reload 
systemctl restart docker 
# 手动下载coredns镜像 
docker pull coredns/coredns:1.8.0 
# 修改镜像tag 
docker tag coredns/coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns:v1.8.0 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

之后再重新初始化

最后生成的join部分是节点加入集群的命令

  • 根据提示操作,创建kubectl
mkdir -p $HOME/.kube 
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 
sudo chown $(id -u):$(id -g) $HOME/.kube/config 
  • 1.
  • 2.
  • 3.
  • 设置kubectl自动补充
source <(kubectl completion bash) 
  • 1.

默认token有效期24小时,过期后token不可用,如果后续有node加入,解决方法是重新生成token

kubeadm token create 
  • 1.
  • 查看token
kubeadm token list 
  • 1.

  • 查看pod
kubectl get pod --all-namespaces 
  • 1.

可以看到coredns的pod没有启动,是pending状态,node节点为NotReady,缺少网络pod

node加入集群

kubeadm join 172.22.29.78:6443 --token gtj686.cu5kxoxbgq8iha4m \ 
        --discovery-token-ca-cert-hash sha256:e6aa8e197b74a08d9bae4b5d72854a49980539bc504691440fe5d716a3d299d9 
  • 1.
  • 2.

查看node

安装网络,这里选择calico

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml 
  • 1.

安装后查看pod状态

从下载镜像到初始化到running状态

calico网络安装的时候,其中有一个pod一直是imagepullbackoff状态

后来发现是因为node没有做镜像仓库加速处理,所以镜像下载失败,导致pod状态一直是imagepullbackoff状态

配置完成后,Pod自动下载镜像,所有pod都running状态

查看node节点的images

至此kubernetes集群部署完毕

测试kubernetes

在集群中创建一个pod,对外暴露端口,验证是否正常访问

# 创建一个nginx的deployment 
kubectl create deployment nginx --image=nginx 
# 对外暴露端口 
kubectl expose deployment nginx --port=80 --type=NodePort 
# 查看pod和svc 
kubectl get pod,svc 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

可以看到nginx的pod映射到宿主机端口为30830,安全组和防火墙开放的情况下尝试访问

部署dashboard

# 下载dashboard编排文件 
wget  https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc7/aio/deploy/recommended.yaml 
# 以该编排文件创建pod 
kubectl create -f recommended.yaml 
# 查看创建好的pod和svc 
kubectl get pod,svc -n kubernetes-dashboard 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

这里改了recommended.yaml里面,kubernetes-dashboard的端口类型为nodeport,并对外暴露30000

访问提示两种登录方式,这里用token登录

# 获取token 
kubectl describe secrets -n kubernetes-dashboard 
  • 1.
  • 2.

复制token然后登录

提示没有权限,重新创建

# 创建sa,并绑定cluster-admin权限 
apiVersion: v1 
kind: ServiceAccount 
metadata: 
  name: dashboard-admin 
  namespace: kube-system 
--- 
kind: ClusterRoleBinding 
apiVersion: rbac.authorization.k8s.io/v1beta1 
metadata: 
  name: dashboard-admin 
subjects: 
  - kind: ServiceAccount 
    name: dashboard-admin 
    namespace: kube-system 
roleRef: 
  kind: ClusterRole 
  name: cluster-admin 
  apiGroup: rbac.authorization.k8s.io 
 
# 将上面的编排文件保存为k8s-admin.yaml,然后创建 
kubectl create -f k8s-admin.yaml 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

重新获取token,重新登录

kubectl describe secret -n kube-system 
  • 1.

创建用户的时候,这里走进误区了,刚开始一直创建的是在kubernetes-dashboard的namespaces,其实这个namespaces下什么权限都没有,所以它创建的user的token是获取不到任何内容的

修改了yaml,重新创建sa之后,在kube-system中找到dashboard-admin用户的token,重新登录后,一切ok

 

责任编辑:武晓燕 来源: 运维研习社
相关推荐

2023-08-03 07:35:10

kubernetes云原生

2012-02-16 10:00:59

2010-06-04 16:17:02

2022-08-21 16:50:36

Kubeadm​Kubernetes

2020-05-20 13:53:41

HTTP环境安装

2019-07-04 13:10:53

Docker设计云计算

2020-04-01 11:11:35

Hadoop运行环境分布式

2011-03-15 15:51:12

netfilteriptables

2021-05-07 09:31:33

KindK8s Operator

2015-10-26 10:14:13

Android开发环境robolectric

2024-10-25 15:25:42

2022-10-08 11:31:30

KubernetesShellRoot

2019-07-23 07:30:16

2020-06-24 11:32:28

网络安全网络安全技术周刊

2015-01-05 14:16:16

DockerFig自动化容器编排

2013-07-02 10:58:48

云计算虚拟化IBM

2021-03-12 08:00:00

Kubernetes工具

2010-02-03 14:37:10

Python 开发环境

2009-07-21 14:18:01

Rails运行环境

2011-05-17 14:02:44

Oracle 8高级复制
点赞
收藏

51CTO技术栈公众号