欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用kubeadm安装单个master的Kubernetes 1.13集群

程序员文章站 2024-01-30 16:35:40
...

硬件条件:

RHEL/CentOS系统或更多
每台机器2GB或更多RAM
每台机器2个CPU或更多CPU
每个节点的唯一主机名,MAC地址和product_uuid
保证端口未被占用,master端口:6443,2379-2380,10250,10251,10252 node端口:10250,30000-32767

资源分配:

节点 ip 服务 备注
k8s01-test.mars.ljnode.com 10.26.14.148 Kubernetes API server,etcd server client AP,Kubelet API,kube-scheduler,kube-controller-manager master
k8s02-test.mars.ljnode.com 10.26.14.233 Kubelet API,NodePort Services** node
k8s03-test.mars.ljnode.com 10.26.14.217 Kubelet API,NodePort Services** node

机器初始化

为了让docker能够启动,对我司腾讯云机器内核模块加载配置进行修改

vim /etc/modprobe.d/blacklist.conf 
 注释掉下面内容: 
#blacklist nf_conntrack 
#blacklist nf_conntrack_ipv6 
#blacklist xt_conntrack 
#blacklist nf_conntrack_ftp 
#blacklist xt_state 
#blacklist iptable_nat 
#blacklist ipt_REDIRECT 
#blacklist nf_nat 
#blacklist nf_conntrack_ipv4 
vim /etc/modprobe.d/connectiontracking.conf 注释掉文件所有内容

为了能让kubernetes很好的运行,需要把swap关闭

swapoff -a

禁用SELINUX

setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

确认一下iptables filter表中FOWARD链的默认策略(pllicy)为ACCEPT。

[[email protected] gaoyaohua001]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

RHEL/CentOS 7上的一些用户报告了由于iptables被绕过而导致流量路由不正确的问题,为了flannel正常工作,你必须通过--pod-network-cidr=10.244.0.0/16到kubeadm init。
设置/proc/sys/net/bridge/bridge-nf-call-iptables为1通过运行sysctl net.bridge.bridge-nf-call-iptables=1 将桥接的IPv4流量传递到iptables的链。这是一些CNI插件工作的要求必须。同时要确认 lsmod | grep br_netfilter

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf

由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块:

ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
在所有的Kubernetes节点上执行以下脚本:

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

上面脚本创建了的/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块。 使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。

接下来还需要确保各个节点上已经安装了ipset软件包yum install ipset。 为了便于查看ipvs的代理规则,最好安装一下管理工具ipvsadm yum install ipvsadm。

如果以上前提条件如果不满足,则即使kube-proxy的配置开启了ipvs模式,也会退回到iptables模式。

所有节点安装

CRI(Container Runtime Interface)默认情况下使用的是Docker
docker-ce-18.06.2.ce安装:

#!/bin/bash
# Install Docker CE
## Set up the repository
### Install required packages.
    yum install yum-utils device-mapper-persistent-data lvm2

### Add docker repository.
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

## Install docker ce.
yum update && yum install docker-ce-18.06.2.ce

## Create /etc/docker directory.
mkdir /etc/docker

# Setup daemon.
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

mkdir -p /etc/systemd/system/docker.service.d

# Restart docker.
systemctl enable docker.service
systemctl daemon-reload
systemctl restart docker

kubeadm,kubelet和kubectl安装:
这里的官网google源被我替换为aliyun了,如果服务器可以*的,可以使用官网提供的源。

#!/bin/bash
#kubernetes install kubelet kubeadm kubectl
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

systemctl enable --now kubelet

服务启动后会拉取一些国外的基础服务镜像,下列操作可以解决这个问题。如果服务器可以*,忽略下边这步。
执行下列脚本

#!/bin/bash
#kubernetes need kubelet kubeadm kubectl images

#kube-apiserver:v1.13.3
#kube-controller-manager:v1.13.3
#kube-scheduler:v1.13.3
#kube-proxy:v1.13.3
#pause:3.1
#etcd:3.2.24
#coredns:1.2.6

list=("kube-apiserver:v1.13.3" "kube-controller-manager:v1.13.3" "kube-scheduler:v1.13.3" "kube-proxy:v1.13.3" "pause:3.1" "etcd:3.2.24")
for i in ${list[@]}
do
	docker pull mirrorgooglecontainers/$i
	docker tag mirrorgooglecontainers/$i k8s.gcr.io/$i
	docker rmi mirrorgooglecontainers/$i
done

docker pull coredns/coredns:1.2.6
docker tag coredns/coredns:1.2.6 k8s.gcr.io/coredns:1.2.6
docker rmi coredns/coredns:1.2.6

master节点安装

执行初始化命令 kubeadm init <args>
参数说明:
For flannel to work correctly, you must pass --pod-network-cidr=10.244.0.0/16 to kubeadm init.
kubeadm uses the network interface associated with the default gateway to advertise the master’s IP. To use a different network interface, specify the --apiserver-advertise-address=<ip-address> argument to kubeadm init

kubeadm init --pod-network-cidr=10.244.0.0/16

安装完后无法执行kubectl命令,如果您是root用户,可以运行下面命令,持久生效请追加写入/root/.bashrc文件里:

export KUBECONFIG=/etc/kubernetes/admin.conf

要使kubectl为非root用户工作,请运行以下命令:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

您必须在任何应用程序启动之前部署安装pod网络插件,以便您的pod可以相互通信,
每个群集只能安装一种Pod网络,我们上边kubeadm init的时候指定了flannel:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

安装完pod网络后,您可以执行下列命令检查CoreDNS pod是否正常工作,一旦CoreDNS pod启动并运行正常,您可以继续加入您的节点。

kubectl get pods --all-namespaces

默认情况下,出于安全原因,您的群集不会在主服务器上安排pod,如果您希望能够在主服务器上安排pod,例如,对于用于开发的单机Kubernetes集群,请运行

kubectl taint nodes --all node-role.kubernetes.io/master-

node节点安装

 kubeadm join 10.26.14.148:6443 --token xldd1m.u1tvqxhgndng4hwq --discovery-token-ca-cert-hash sha256:52c5f7e4296b7b5a8cb438df7e18a1212b8112d102935b293d50bd6369842cf3

登陆master执行下列命令查看,如果NotReady,等待一会就好了

[[email protected] gaoyaohua001]# kubectl get nodes
NAME                         STATUS     ROLES    AGE     VERSION
k8s01-test.mars.ljnode.com   Ready      master   19m     v1.13.3
k8s02-test.mars.ljnode.com   Ready      <none>   4m35s   v1.13.3
k8s03-test.mars.ljnode.com   NotReady   <none>   4m16s   v1.13.3

看到node没有标签,可以通过下边命令,修改node或者master节点的标签

kubectl label node k8s02-test.mars.ljnode.com  node-role.kubernetes.io/node='node'

默认token的有效期为24小时,当过期之后,该token就不可用了。
//如过期,这时候加入新的node节点需要创建token重新生成

kubeadm token create 

kubeadm token list

1tlid0.jqr1dxk3fbpmtn1l

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //‘

7159754590021250eb237130e655476d32c2bde6443ad5bfbe62d45978422c50

kubeadm join 192.168.61.11:6443 --token 1tlid0.jqr1dxk3fbpmtn1l --discovery-token-ca-cert-hash sha256:7159754590021250eb237130e655476d32c2bde6443ad5bfbe62d45978422c50

参考文档:
https://kubernetes.io/docs/setup/independent/install-kubeadm/

http://www.updn.cn