部署Kubernetes集群
环境准备
角色 | IP |
---|---|
master | 192.168.46.130 |
node1 | 192.168.46.131 |
node2 | 192.168.46.xxx |
设置主机名
# master节点的主机名
hostnamectl set-hostname k8s-master
# node1节点的主机名
hostnamectl set-hostname k8s-node1
# node2节点的主机名
hostnamectl set-hostname k8s-node2
注:修改也可使用vim /etc/hostname,打开文件进行修改;
查看当前的hostname可使用cat /etc/hostname,也可使用hostname或hostnamectl
配置 hosts
vim /etc/hosts
# 添加以下内容
192.168.46.130 k8s-master
192.168.46.131 k8s-node1
192.168.46.xxx k8s-node2
注:查看设置可使用命令cat /etc/hosts | grep k8s
确认MAC和product_uuid的唯一性
# 查看MAC
ip link
# ifconfig -a
# 查看product_uuid
cat /sys/class/dmi/id/product_uuid
添加 IP 路由规则
由于是本地内网测试环境,直接关闭了防火墙。若安全要求较高, 可以参考官方文档放行必要端口
# 关闭服务
systemctl stop firewalld
# 禁用服务
systemctl disable firewalld
禁用交换分区
vim /etc/fstab
# /dev/mapper/centos-swap swap swap defaults 0 0
将swap注释掉
转发 IPv4 并让 iptables 看到桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
安装Kubernetes
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
sudo systemctl enable --now kubelet
kubeadm:用来初始化集群的指令。
kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
kubectl:用来与集群通信的命令行工具。
部署Kubernetes Master
sudo kubeadm init \
--apiserver-advertise-address=192.168.46.130 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
--apiserver-advertise-address
指定api地址,这里配置成了master的私网接口IP,例如我的Master主机的IP是:192.168.180.123
--image-repository
这个是镜像地址,由于国外地址无法访问,故使用的阿里云仓库地址:registry.aliyuncs.com/google_containers
--kubernetes-version
这个参数指定要安装的k8s版本
--service-cidr
这个参数后的IP地址直接就套用10.96.0.0/12 ,以后安装时也套用即可,不要更改
--pod-network-cidr
k8s内部的pod节点之间网络可以使用的IP段,不能和service-cidr写一样,如果不知道怎么配,就先用这个10.244.0.0/16
等待执行完毕后, 会输出如下内容:
...
Your Kubernetes control-plane has initialized successfully!
...
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.46.130:6443 --token s9gac1.xm93o2f84tuxr375 \
--discovery-token-ca-cert-hash sha256:a362b29d7248baaac0c73d18c242623e22a2366936c86487d9fc3e9665c76e7e
最后两行需要保存下来, kubeadm join ...是slave节点加入所需要执行的命令.
接下来配置环境, 让当前用户可以执行kubectl命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
测试一下
kubectl get node
节点为notready状态,通过以下命令查看
kubectl describe node k8s-master | grep network
配置网络
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
部署 Nginx
查询镜像
docker search nginx
没有则拉取
docker images
执行安装
kubectl create deployment nginx --image=nginx
查看状态
kubectl get pod
查看service服务
kubectl get svc
容器编排
kubectl expose deployment nginx --port=80 --type=NodePort