使用kubeadm安装单个master的Kubernetes 1.13集群
硬件条件:
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
上一篇: centos-7升级 openssh-server 到7.9
下一篇: AIX中FTP日志文件的方法