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