硬件条件:

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。

[root@k8s01-test 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

为了可以让kubectl 命令后的参数能够自动补全

echo "source <(kubectl completion bash)" >> ~/.bashrc

您必须在任何应用程序启动之前部署安装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,等待一会就好了

[root@k8s01-test 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

admin kubernetes

发表评论

电子邮件地址不会被公开。 必填项已用*标注