之前体验了 minikube, 掉深坑里至今还没有爬出来, 玩单节点用 minikube 够了,
但傻瓜试的安装让人对 k8s 理解不是很深刻 (坑), 而且多节点好像有什么奇怪的问题
所以我这次要用两个虚拟机来模拟 k8s 集群 一主节点一工作节点
hostname ipaddr CPU 硬盘 内存 OS docker k8s
- m1 1921.168.1.200 2 20G 2G centos7 18 1.16.2
- w1 1921.168.1.201 2 20G 2G centos7 18 1.16.2
由于我使用的虚拟机驱动是 hyper-v 所以要记得每个虚拟机关闭动态内存 关于虚拟机的安装配置这里就不再深入讨论
虚拟机交换机
动态内存关闭
我先创建一个虚拟机, 安装完 docker,k8s 和一些其他配置后, 再复制, 这样比较快一点
但是 k8s 集群里的节点 Mac 和 uuid 不能重复, 这个到时再想办法修改
安装 CentOS 时选择最小安装, 图形界面不安装, 这样比较省计算机资源
最小安装完成重启后, 需要做的事情 1. 修改网卡为开机自动启动, 2. 打开 SSH
先来打开 SSH 吧, hyper-v 里面操作不方便 我要用 powersheel 连接上去
vi /etc/SSH/sshd_config
取消两行注, 由于我是用 root 登录, 所以要将 permitrootlogin 设置成 yes
重启服务
service sshd restart
接下来把网卡设置成开机自启, 因为现在网卡是没有启动的
先 ip addr 查一下网卡名称 然后进入到 /etc/sysconfig/network-scripts / 目录 ls|grep 网卡名称
原来的配置为 动态获取 ip, 不开机自动启动
修改成, 开机自动启动, 静态 ip
修改 hosts 文件
vi /etc/hosts
在后面加上两个节点的 host
- 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
- ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
- 192.168.1.200 m1
- 192.168.1.201 w1
保存后
reboot 指令重启
管理员权限打开 powershell 输入 SSH root@192.168.1.200 连接
如果出现
到用户目录 /.SSH/known_hosts 编辑删除现有 ip 的那一行重连即可
连上来后, 先更新 yum
- install -y yum-utils device-mapper-persistent-data lvm2
- yum update
再设置 docker 仓储
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
然后安装 18 版本的 docker, 安装太高 k8s 用不了
yum install docker-ce-18.09.6 docker-ce-cli-18.09.6 containerd.io
安装完成后 设置启动 docker 并设置开机启动
systemctl start docker && systemctl enable docker
接下来设置 docker 的镜像源, 否则将被墙
- [root@localhost ~]# mkdir -p /etc/docker
- [root@localhost ~]# tee /etc/docker/daemon.JSON <<-'EOF'
- > {
- > "registry-mirrors": ["https:// 自己去注册自己的不懂百度. mirror.aliyuncs.com"]
- >
- }
- > EOF
把 daemon.JSON 改名为 daemon.conf
mv /etc/docker/daemon.JSON /etc/docker/daemon.conf
设置好重启一下 docker
- [root@localhost ~]# systemctl daemon-reload
- [root@localhost ~]# systemctl restart docker
最后设置 k8s 相关的配置 先设置 hostname 为主节点 m1 (master node
[root@localhost ~]# hostnamectl set-hostname m1
重新登录一下验证是否修改成功
- [root@localhost ~]# exit
- logout
- Connection to 192.168.1.200 closed.
- PS C:\Windows\system32> SSH root@192.168.1.200
- root@192.168.1.200's password:
- Last login: Mon Nov 4 20:42:51 2019 from 192.168.1.104
- [root@m1 ~]#
关防火墙
- [root@m1 ~]# systemctl stop firewalld
- [root@m1 ~]# systemctl disable firewalld
禁用 swap
- [root@m1 ~]# swapoff -a
- [root@m1 ~]# sed -i.bak '/swap/s/^/#/' /etc/fstab
修改网桥模式
- [root@m1 ~]# sysctl.NET.bridge.bridge-nf-call-iptables=1
- [root@m1 ~]# sysctl.NET.bridge.bridge-nf-call-ip6tables=1
- [root@m1 ~]# cat <<EOF> /etc/sysctl.d/k8s.conf
- > net.bridge.bridge-nf-call-ip6tables = 1
- > net.bridge.bridge-nf-call-iptables = 1
- > EOF
- [root@m1 ~]# sysctl -p /etc/sysctl.d/k8s.conf
给 yum 加 kubernetes 阿里云 镜像源
- [root@m1 ~]# cat <<EOF> /etc/yum.repos.d/kubernetes.repo
- > [kubernetes]
- > name=Kubernetes
- > baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
- > enabled=1
- > gpgcheck=1
- > repo_gpgcheck=1
- > gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
- > EOF
更新 yum 缓存
- yum clean all
- yum -y makecache
安装 kubeadm kubelet kubectl
kubelet 运行在集群所有节点上, 用于启动 Pod 和容器等对象的工具
kubeadm 用于初始化集群, 启动集群的命令工具
kubectl 用于和集群通信的命令行, 通过 kubectl 可以部署和管理应用, 查看各种资源, 创建, 删除和更新各种组件
yum install -y kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2
启动 kubelet 并设置开机自动启动
[root@m1 ~]# systemctl enable kubelet && systemctl start kubelet
创建下载 kubernetes 镜像缓存脚本 , 并启动它下载
- vi image.sh
- #!/bin/bash
- url=registry.cn-hangzhou.aliyuncs.com/google_containers
- version=v1.16.2
- images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
- for imagename in ${images[@]} ; do
- docker pull $url/$imagename
- docker tag $url/$imagename k8s.gcr.io/$imagename
- docker rmi -f $url/$imagename
- done
发现没有权限
- [root@m1 ~]# ./image.sh
- -bash: ./image.sh: Permission denied
给权限后重新执行脚本
- chmod 777 image.sh
- ./image.sh
结束后查看一下 docker 的镜像
- [root@m1 ~]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- k8s.gcr.io/kube-proxy v1.16.2 8454cbe08dc9 2 weeks ago 86.1MB
- k8s.gcr.io/kube-apiserver v1.16.2 c2c9a0406787 2 weeks ago 217MB
- k8s.gcr.io/kube-controller-manager v1.16.2 6e4bffa46d70 2 weeks ago 163MB
- k8s.gcr.io/kube-scheduler v1.16.2 ebac1ae204a2 2 weeks ago 87.3MB
- k8s.gcr.io/coredns 1.3.1 eb516548c180 9 months ago 40.3MB
- k8s.gcr.io/etcd 3.3.10 2c4adeb21b4f 11 months ago 258MB
- k8s.gcr.io/pause 3.1 da86e6ba6ca1 22 months ago 742kB
说明下载正常
, 接下来我要将这个虚拟机备份一下, 将来之前做的那些工作都可以用还原的方式略过了
然后我删除了虚拟机 k8s-m1, 因为我要重新规划保存的位置
把刚才导出的虚拟机导入
再导入一次, 为工作节点
接下来把刚才导入的两个虚拟机再次删除, 我们要的只是他硬盘里的数据, 否则 product_uuid 会重复, 所以我们要多做几步操作
添加 新的虚拟机, 选择硬盘为刚才导入时选择的硬盘, 前面内存那里记得不要选动态内存, 如法炮制 k8s-w1
这时两个虚拟机的静态 ip 是冲突的, 我们启动第二台修改 ip 地址为 192.168.1.201
vi /etc/sysconfig/network-scripts/ifcfg-eth0
hostname 也修改成 w1
hostnamectl set-hostname w1
修改好后 reboot 重启 顺便把 k8s-m1 也启动
删除 C:\Users\hbb\.sshknown_hosts 后开两个管理员权限的 ps 连接上 m1 和 w1
接下来我们两边都修改 hosts 文件, 加入 我们规划好的 ip 的别名
vi /etc/hosts
查看 Mac 和 uuid 是否冲突
- cat /sys/class.NET/eth0/address
- cat /sys/class/dmi/id/product_uuid
都没有冲突了
接下来做主节点 m1 的配置, 下面的操作只需要在 m1 上执行
kubeadm init --apiserver-advertise-address 192.168.1.200 --pod-network-cidr=10.244.0.0/16
导入环境变量
- [root@m1 ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf">> ~/.bash_profile
- [root@m1 ~]# source .bash_profile
安装网络策略,
kubectl create -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml
默认情况下 master 上不能安装 pod, 因为主节点上打上了污点
如果要在 master 上安装 pod, 则要把污点去掉
查看污点
- [root@m1 ~]# kubectl describe node m1|grep -i taints
- Taints: node-role.kubernetes.io/master:NoSchedule
删除默认的污点
- [root@m1 ~]# kubectl taint nodes m1 node-role.kubernetes.io/master-
- node/m1 untainted
打污点的语法有兴趣可以自己去研究, 这里不再介绍太多
接下来就是工作节点 w1 了
在我刚把 m1 kubeinit 时产生了一个 命令, 可以复制去子节点上执行以加入 主节点
也可以手动创建
kubeadm token create --print-join-command
复制去工作节点上执行就可以直接加入主节点
工作节点执行效果如下
主节点查看 node service pod compoent
- [root@m1 ~]# kubectl get node
- NAME STATUS ROLES AGE VERSION
- m1 Ready master 18m v1.16.2
- w1 Ready <none> 11m v1.16.2
- [root@m1 ~]# kubectl get svc --all-namespaces
- NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 18m
- kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 18m
- [root@m1 ~]# kubectl get pods --all-namespaces
- NAMESPACE NAME READY STATUS RESTARTS AGE
- kube-system calico-kube-controllers-dc6cb64cb-856pv 1/1 Running 0 15m
- kube-system calico-node-k259l 1/1 Running 0 12m
- kube-system calico-node-z5wbs 1/1 Running 0 15m
- kube-system coredns-5644d7b6d9-v8wjh 1/1 Running 0 19m
- kube-system coredns-5644d7b6d9-z2zsw 1/1 Running 0 19m
- kube-system etcd-m1 1/1 Running 0 18m
- kube-system kube-apiserver-m1 1/1 Running 0 18m
- kube-system kube-controller-manager-m1 1/1 Running 0 18m
- kube-system kube-proxy-b882q 1/1 Running 0 12m
- kube-system kube-proxy-vxfxj 1/1 Running 0 19m
- kube-system kube-scheduler-m1 1/1 Running 0 17m
- [root@m1 ~]# kubectl get cs --all-namespaces
- NAME AGE
- scheduler <unknown>
- controller-manager <unknown>
- etcd-0 <unknown>
接下来可以加入一些 pod 测试 , 加入 pod 的方式有两种
使用 YAML 文件安装 / 卸载 -f 后面接一个 YAML 文件, 可以是网络路径
- kubectl create -f kubernetes-dashboard.YAML
- kubectl remove -f kubernetes-dashboard.YAML
一种是直接使用镜像, 直接使用镜像比较少见
本人也还没有研究, 可以参考这个地方
http://docs.kubernetes.org.cn/618.html
来源: https://www.cnblogs.com/nocanstillbb/p/11798854.html