前言
kubeadm是kubernetes官方提供的一种快速安装k8s集群的工具,在这里分享给大家
一、基础环境
1、配置主机名与解析
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2
vim /etc/hosts
172.31.103.123 master
172.31.103.124 node1
172.31.103.125 node2
2、配置SSH无密码登陆(三台服务器都需要免密)
ssh-keygen
ssh-copy-id -i id_rsa.pub root@172.31.103.*
3、时间同步
(1)配置master节点
yum -y install chrony
systemctl start chronyd
timedatectl set-ntp true
vim /etc/chrony.conf
allow 172.31.103.0/24
local stratum 10
systemctl restart chronyd.service
(2)配置node节点
vim /etc/chrony.conf
server 172.31.103.123 iburst
systemctl restart chronyd.service
chronyc sources -v
4、修改iptables相关参数(所有节点)
vim /etc/sysctl.d/k8s.conf
vm.swappiness = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
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
yum install ipset ipvsadm -y
5、安装docker
yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates | sort -r
yum install -y docker-ce
systemctl start docker
systemctl enable docker
二、安装kubeadm、kubelet、kubectl
kubelet 在群集中所有节点上运行的核心组件, 用来执行如启动pods和containers等操作。 kubeadm引导启动k8s集群的命令行工具,用于初始化 Cluster。 kubectl 是 Kubernetes 命令行工具。通过 kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。
1、配置kubernetes.repo的源,由于官方源国内无法访问,这里使用阿里云yum源(所有节点)
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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet
systemctl start kubelet
2、部署master节点
(1)master节点执行初始化
kubeadm init \
--apiserver-advertise-address=172.31.103.123 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.14.1 \
--pod-network-cidr=10.244.0.0/16
--apiserver-advertise-address
指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface
--pod-network-cidr
指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 --pod-network-cidr 有自己的要求,这里设置为 10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR
--image-repository
Kubenetes默认Registries地址是 k8s.gcr.io,在国内并不能访问 gcr.io,在1.13版本中我们可以增加–image-repository参数,默认值是 k8s.gcr.io
--kubernetes-version=v1.14.1
关闭版本探测,因为它的默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号
kubeadm join 172.31.103.123:6443 --token sq57eo.r69ngz2xxsinpy4j --discovery-token-ca-cert-hash sha256:1172ab1462a3a9da22d3f816f1245ee37539b678a39de958a028204ce85a56c1
(2)配置 kubectl
kubectl 是管理 Kubernetes Cluster 的命令行工具,前面我们已经在所有的节点安装了 kubectl。Master初始化完成后需要做一些配置工作,然后 kubectl 就能使用了。 依照 kubeadm init 输出的最后提示,推荐用 Linux普通用户执行 kubectl。
useradd centos && echo "centos:123456" | chpasswd centos
sed -i '/^root/a\centos ALL=(ALL) NOPASSWD:ALL' /etc/sudoers
su - centos
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
echo "source <(kubectl completion bash)" >> ~/.bashrc
kubectl get cs
确认各个组件都处于healthy状态
查看节点状态
kubectl get nodes
kubectl describe node master
kubectl get pod -n kube-system -o wide
可以看到,CoreDNS依赖于网络的 Pod 都处于 Pending 状态,即调度失败。这当然是符合预期的:因为这个 Master 节点的网络尚未就绪。
(3)部署网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl get pod -n kube-system -o wide
kubectl get nodes
至此,Kubernetes 的 Master 节点就部署完成了。如果你只需要一个单节点的Kubernetes,现在你就可以使用了。不过,在默认情况下,Kubernetes 的 Master 节点是不能运行用户 Pod 的。
3、部署worker节点
kubeadm join 172.31.103.123:6443 --token sq57eo.r69ngz2xxsinpy4j --discovery-token-ca-cert-hash sha256:1172ab1462a3a9da22d3f816f1245ee37539b678a39de958a028204ce85a56c1
kubeadm token create --print-join-command
kubectl get nodes
查看所有pod状态
kubectl get pod --all-namespaces -o wide
这时,所有的节点都已经 Ready,Kubernetes Cluster 创建成功,一切准备就绪。如果pod状态为Pending、ContainerCreating、ImagePullBackOff 都表明 Pod没有就绪,Running 才是就绪状态。
4、测试集群各个组件
kubectl create deployment nginx --image=nginx:alpine
kubectl scale deployment nginx --replicas=2
kubectl get pods -l app=nginx -o wide
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get services nginx
访问master
访问node1 访问node2
kubectl run -it curl --image=radial/busyboxplus:curl
查看是否可以正确解析出集群内的IP,以验证DNS是否正常
nslookup nginx
通过服务名进行访问,验证kube-proxy是否正常:
curl http://nginx/
分别访问一下2个Pod的内网IP,验证跨Node的网络通信是否正常
5、Pod调度到Master节点
kubectl describe node master | grep Tain
kubectl taint node master node-role.kubernetes.io/master-
kubectl taint node master node-role.kubernetes.io/master=:NoSchedule
6、kube-proxy开启ipvs
kubectl edit cm kube-proxy -n kube-system
kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
kubectl get pod -n kube-system | grep kube-proxy
kubectl logs kube-proxy-fmvz6 -n kube-system
7、移除节点和集群
kubectl drain node2 --delete-local-data --force --ignore-daemonsets
kubectl delete node node2
kubeadm reset
结语
至此kubeadm安装k8s集群就到这里了,这篇是我几年前写的,版本已经很落后了,之后会为大家写一篇二进制安装的高可用k8s集群安装方法,希望大家多多支持哈
|