基于red hat 的发行版本 centerOS
具体操作
master上执行:
1 | [root@localhost ~]# hostnamectl --static set-hostname k8s-master |
---|
node1上执行:
1 | [root@localhost ~]# hostnamectl --static set-hostname k8s-node-1 |
---|
node2上执行:
1 | [root@localhost ~]# hostnamectl --static set-hostname k8s-node-2 |
---|
在三台机器上设置hosts,均执行如下命令:
echo '192.168.17.149 k8s-master
192.168.17.150 k8s-node-1
192.168.17.151 k8s-node-2' >> /etc/hosts
systemctl disable firewalld.service
systemctl stop firewalld.service
yum install ntpdate ‐y
ntpdate time.windows.com
swapoff -a #临时关闭
vim /etc/fstab #永久关闭
#注释掉swap这行
# /dev/mapper/centos‐swap swap swap defaults 0 0
systemctl reboot#重启生效
free ‐m #查看下swap交换区是否都为0,如果都为0则swap关闭成功
sed ‐i "s/enforcing/disabled/" /etc/selinux/config #永久关闭
确保 br_netfilter
模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter
来完成。若要显式加载该模块,可执行 sudo modprobe br_netfilter
。
为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl
配置中将 net.bridge.bridge-nf-call-iptables
设置为 1。例如:
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
Docker 需要提前安装好。
安装docker
yum install wget -y
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum install docker-ce docker-ce-cli -y
或者使用rpm包安装
yum list docker-ce --showduplicates | sort -r
yum -y install docker-ce-18.06.1.ce-3.el7
systemctl enable docker && systemctl start docke
systemctl status docke
编辑/etc/docker/daemon.json
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl daemon-reload && systemctl enable docker && systemctl start docker
Docker 在默认情况下使用的 Cgroup Driver 为cgroupfs
而 Kubernetes 其实推荐使用systemd来代替cgroupfs
修改docker配置以适应kubelet (没有该文件就新建一个)
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl daemon-reload
systemctl restart docker
docker info | grep Cgroup* #查看是否修改成功
kubernete 开启ipvs 模式,主要修改kube-proxy 配置
Linux命令:modprobe 。功能说明:自动处理可载入模块。
lsmod 是一个命令行实用程序,用于显示有关已加载的Linux内核模块的信息
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
lsmod | grep ip_vs
lsmod | grep nf_conntrack_ipv4
yum install -y ipvsadm ipset
【深度】这一次,彻底搞懂 kube-proxy IPVS 模式的工作原理! - 云+社区 - 腾讯云 (tencent.com)
# 配置kubernates yum 源
cat <<EOF | sudo tee /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
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
#查看可以安装的版本
yum list kubelet --showduplicates | sort -r
# 安装指定版本
yum install -y kubelet-1.18.8 kubeadm-1.18.8 kubectl-1.18.8
#开机启动 kubelet
#sudo systemctl enable --now kubelet
systemctl enable kubelet
systemctl start kubelet
setenforce 0
和 sed ...
将 SELinux 设置为 permissive 模式 可以有效地将其禁用。 这是允许容器访问主机文件系统所必需的,而这些操作时为了例如 Pod 网络工作正常。
你必须这么做,直到 kubelet 做出对 SELinux 的支持进行升级为止。kubeadm init <args>
控制平面节点是运行控制平面组件的机器, 包括 etcd (集群数据库) 和 API Server (命令行工具 kubectl 与之通信)。
--control-plane-endpoint
为所有控制平面节点设置共享端点。 端点可以是负载均衡器的 DNS 名称或 IP 地址。kubeadm init
传递参数。 根据你选择的第三方网络插件,你可能需要设置 --pod-network-cidr
的值。 请参阅 安装Pod网络附加组件。kubeadm
尝试使用一系列众所周知的域套接字路径来检测 Linux 上的容器运行时。 要使用不同的容器运行时, 或者如果在预配置的节点上安装了多个容器,请为 kubeadm init
指定 --cri-socket
参数。 请参阅安装运行时。kubeadm
使用与默认网关关联的网络接口来设置此控制平面节点 API server 的广播地址。 要使用其他网络接口,请为 kubeadm init
设置 --apiserver-advertise-address=<ip-address>
参数。 要部署使用 IPv6 地址的 Kubernetes 集群, 必须指定一个 IPv6 地址,例如 --apiserver-advertise-address=fd00::101
所有节点安装之前记得先把镜像准备好,否者将无法启动,也不报错。
--pod-network-cidr=10.10.0.0/16
--service-cidr=10.20.0.0/16 # pod 和service 网段要区分开时设置
--kubernetes-version=v1.18.0 #指定安装的版本
--image-repository registry.aliyuncs.com/google_containers
--apiserver-advertise-address=k8s-master机器的ip
kubeadm init --apiserver-advertise-address=192.168.17.149 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.8 --pod-network-cidr=10.10.0.0/16 --service-cidr=10.20.0.0/16
--kubernetes-version v1.18.8 指定版本
--apiserver-advertise-address 为通告给其它组件的IP,一般应为master节点的IP地址
--service-cidr 指定service网络,不能和node网络冲突
--pod-network-cidr 指定pod网络,不能和node网络、service网络冲突
--image-repository registry.aliyuncs.com/google_containers 指定镜像源,由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
如果k8s版本比较新,可能阿里云没有对应的镜像,就需要自己从其它地方获取镜像了。
--control-plane-endpoint 标志应该被设置成负载均衡器的地址或 DNS 和端口(可选)
配置文件安装
1.生成文件命令
kubeadm config print init-defaults >init-config.yaml
2.修改init-config.yaml 配置内容,进行安装
kubeadm init --config=init-config.yaml
kubeadm init 命令执行成功 be like
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
#需要执行以下命令,下面的命令是配置如何使用kubectl访问集群的方式
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a Pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
/docs/concepts/cluster-administration/addons/
You can now join any number of machines by running the following on each node
as root: #记得拷贝以下命令,用于node 节点加入集群
kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
要使非 root 用户可以运行 kubectl,请运行以下命令, 它们也是 kubeadm init
输出的一部分:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
或者,如果你是 root
用户,则可以运行:
export KUBECONFIG=/etc/kubernetes/admin.conf
#查看kubectl是否能正常使用
kubectl get nodes
kubectl apply -f <add-on.yaml>
每个集群只能安装一个 Pod 网络。
安装 Pod 网络后,您可以通过在 kubectl get pods --all-namespaces
输出中检查 CoreDNS Pod 是否 Running
来确认其是否正常运行。 一旦 CoreDNS Pod 启用并运行,你就可以继续加入节点。
安装POD network Flannel(DamonSet)
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
修改kube-flannel.yml
更改 128行的网络配置,要和 pod-network-cidr保持一致
cat kube-flannel.yml | grep Network
kubectl apply -f kube-flannel.yaml
如果您的网络无法正常工作或 CoreDNS 不在“运行中”状态,请查看kubeadm
的故障排除指南。
kubectl -n kube-system get pods -o wide #查看是否创建成功
默认情况下,出于安全原因,你的集群不会在控制平面节点上调度 Pod。 如果你希望能够在控制平面节点上调度 Pod, 例如用于开发的单机 Kubernetes 集群,请运行:
kubectl taint nodes --all node-role.kubernetes.io/master-
K8S集群node节点执行,master 节点init 成功后的命令
节点是你的工作负载(容器和 Pod 等)运行的地方。要将新节点添加到集群,请对每台计算机执行以下操作:
sudo su -
)kubeadm init
输出的命令。例如:kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
kubeadm join 192.168.17.149:6443 --token gfs8qb.shcvgzxrcflaw19m \
--discovery-token-ca-cert-hash sha256:a47db38d409c8135969aeee18b1371230dfabfd8fed860691b02f717543a8f85
如果没有令牌,可以通过在控制平面节点上运行以下命令来获取令牌:
kubeadm token list
令牌过期重新生成
kubeadm token create --print-join-command
为了使 kubectl 在其他计算机(例如笔记本电脑)上与你的集群通信, 你需要将管理员 kubeconfig 文件从控制平面节点复制到工作站,如下所示:
scp root@<control-plane-host>:/etc/kubernetes/admin.conf .
kubectl --kubeconfig ./admin.conf get nodes
问题:
在master 节点中无法ping 通 services 的 cluster-ip
原因 kube-proxy 未指定 mode 为ipvs模式
[root@k8s-master ~]# kubectl logs -n kube-system kube-proxy-sb4jf
W1203 20:40:41.062897 1 server_others.go:559] Unknown proxy mode "", assuming iptables proxy
kube-proxy使用了iptable模式,修改为ipvs模式
修改后可以正常ping通
[root@k8s-master ~]# kubectl get services -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.20.0.1 <none> 443/TCP 26d
kube-system kube-dns ClusterIP 10.20.0.10 <none> 53/UDP,53/TCP,9153/TCP 26d
kube-system kuboard NodePort 10.20.82.143 <none> 80:32567/TCP 10h
kube-system metrics-server ClusterIP 10.20.254.12 <none> 443/TCP 10h
[root@k8s-master ~]# ping 10.20.82.143
PING 10.20.82.143 (10.20.82.143) 56(84) bytes of data.
64 bytes from 10.20.82.143: icmp_seq=1 ttl=64 time=0.302 ms
64 bytes from 10.20.82.143: icmp_seq=2 ttl=64 time=0.060 ms
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。