k8s搭建手札-kubeadm
目标:1个master 2个node
宿主机:3个centos7 parallel 虚拟机
1. 关闭防火墙、关闭iptables规则、seliunx、禁用swap分区,修改liunx内核参数,安装ipvs
关防火墙:
systemctl stop firewalld.service
systemctl disable firewalld.service
关iptable:
systemctl stop iptables
systemctl disable iptables
关selinux:
# 查看状态 getenforce # 临时关闭 getenforce 0 # 永久关闭 vim /etc/selinux/config SELINUX=disabled
禁用swap分区
# 编辑 /etc/fstab 注释swap行
修改linux内核
# 编辑配置文件 vim /etc/sysctl.d/kubernetes.conf # 文件内容 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 # liunx数据包转发
# 让配置生效
sysctl -p
# 加载网桥过滤模块
modprobe br_netfilter
# 查看是否成功
lsmod | grep br_netfilter
配置ipvs功能
# 安装ipset ipvsadm yum install ipset ipvsadm -y i
# 添加脚本文件
cat </etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
# 添加权限
chmod +x /etc/sysconfig/modules/ipvs.modules
# 执行
/bin/bash /etc/sysconfig/modules/ipvs.modules
# 查看状态
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
重启服务器
reboot
2. 安装docker与kubernetes组件
# 切换yum镜像源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 安装docker,使用参数--setopt=obsoletes=0安装指定的docker版本,否则可能安装更高的版本
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
添加docker配置文件
其中xxxx需要登陆自己的阿里云-镜像服务-镜像加速器获取
mkdir /etc/docker
cat </etc/docker/daemon.json {"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"] }
EOF
systemctl restart docker
systemctl enable docker
docker version
添加kubernetes组件
# 添加配置文件
vim /etc/yum.repos.d/kubernetes.repo
文件内容
[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
安装kube相关工具
yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
配置kubelet的cgroup,编辑/etc/sysconfig/kubelet
KUBELET_CGROUP_ARGA="--cgroup-driver=systemd" KUBE_PROXY_MODE="ipvs"
3. 初始化k8s集群
修改hostname
# 修改master hostnamectl set-hostname master # 修改子节点在子节点及其上执行 hostnamectl set-hostname node1 hostnamectl set-hostname node2
脚本准备镜像
#!/bin/bash images=( kube-apiserver:v1.17.4 kube-controller-manager:v1.17.4 kube-scheduler:v1.17.4 kube-proxy:v1.17.4 pause:3.1 etcd:3.4.3-0 coredns:1.6.5 ) for imageName in ${images[@]};do docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName done
查看下载镜像
docker images
集群初始化,只需要在master节点上进行,确保master节点cpu与内存资源足够,
先切换centos为命令行启动
systemctl set-default multi-user.target
# 修改分辨率
vim /etc/default/grub
# 倒数第二行引号内添加 vga=0x314
grub2-mkconfig > /boot/grub2/grub.cfg
kubeadm init \ --kubernetes-version=v1.17.4 \ --pod-network-cidr=10.96.0.0/16 \ --service-cidr=10.96.0.0/12 \ --apiserver-advertise-address=10.211.55.6
配置拷贝,子节点也需要.kube/config,否则kubectl用不了
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
添加节点,添加的命令在master节点安装成功后的打印中
kubeadm join 10.211.55.7:6443 --token bw8h0b.itkgtgiqa8gdcukq --discovery-token-ca-cert-hash sha256:aa42f850979a73b68a1b20841057b19cf0a31b3f28ed29ae67d8cdfdd53d7a54
4. 网络安装
只需在master节点执行
下载配置文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
安装
kubectl apply -f kube-flannel.yml
# 遇到的问题
# 1.如果安装错误执行以下命令删除flannel
kubectl delete -f kube-flannel.yml
这里有可能flannel镜像下载失败,需要手动下载,如果镜像库与配置文件中不一样需要改镜像名字
先查看flannel是否启动成功
kubectl get pod -n kube-system
如果flannel不是running,需要手动下载镜像,需要注意如果手动下载镜像子节点也需要手动下载
docker pull quay.io/coreos/flannel:v0.15.1
flannel的pod打印日志k8s flannel pod cidr not assigned,通过以下命令解决
kubectl patch node centos-linux.shared -p '{"spec":{"podCIDR":"10.96.0.0/16"}}'
kubectl patch node node1 -p '{"spec":{"podCIDR":"10.96.0.0/16"}}'
kubectl patch node node2 -p '{"spec":{"podCIDR":"10.96.0.0/16"}}'
5. 搭建nginx
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看svc端口
kubectl get pods,svc
# 我出现了不能访问master节点ip:port的服务,但是可以访问子节点的ip:port,原因可能是网卡造成的
6. master节点重启
重启后执行以下命令启动k8s
systemctl daemon-reload
systemctl restart kubelet
7. NodePort无法从其他node访问service问题解决
先关掉所有虚拟机,然后每台虚拟机再加一张网卡,模式为host only
修改flannel网卡
kubectl edit daemonset kube-flannel-ds -n kube-system
containers: - args: - --ip-masq - --kube-subnet-mgr - --iface=eth1 # 添加这句,eth1为新加的host only网卡
然后删除所有flannel pod