k8s
KubernetesBV1Qv41167ck (黑马程序员 Kubernees)k8s集群环境的搭建 · 语雀 (yuque.com)文章目录Kubernetes集群类型安装方式2.2 环境搭建2.2 环境搭建2.2.3 安装docker安装kubernetes 组件准备集群镜像集群初始化安装网络插件2.3 服务部署资源管理其中需要关注的是 nginx 行的 PORT(S) 字段 80:30129
Kubernetes
BV1Qv41167ck (黑马程序员 Kubernees)
文章目录
集群类型
- 一主多从, 测试环境
- 多主多从, 生产环境
安装方式
- minikube: 快速搭建单节点
- kubeadm: 快速搭建集群
- 二进制包
现在使用 kubeadm 方式
2.2 环境搭建
3)时间同步
kubernetes要求集群中的节点时间必须精确一致
使用 chronyd 服务
systemctl start chronyd # 启动
systemctl enable chronyd # 开机自启
date
没有 chronyd 则要安装
yum install -y chrony
- 禁用
iptables
和firewalld
服务
kubernetes 和 docker 在运行中会产生大量的 iptables 规则, 为了不让系统规则跟它们混淆, 直接关闭系统规则
# 关闭 firewalld
systemctl stop firewalld
systemctl disable firewalld
# 关闭 iptables
systemctl stop iptables
systemctl disable iptables
- 禁用 SELinux (安全服务)
编辑 /etc/selinux/config
SELINUX=disabled
重启系统
6) 禁用 swap
分区
swap: 虚拟内存分区,在物理内存使用完成之后, 将磁盘空间虚拟成内存来使用
启用 swap会对系统性能产生负面影响, kubernetes 要求每个节点都要禁用 swap
但是如果因为某些原因确实不能关闭swap, 就需要在集群安装过程中通过配置说明
# 编辑分区配置文件 /etc/fstab , 注释swap分区一行
# 注意修改完毕后要重启Linux服务
UUID=...
# /dev/mapper/centos-swap swap
- 修改Linux内核参数
# 添加网桥过滤和地址转发的功能
# 编辑 /etc/sysctl.d/kubernetes.conf 添加
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
# 重新加载配置
sysctl -p
# 加载网桥过滤模块
modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
lsmod | grep br_netfilter
----- 这里机器没有grep出
br_netfileter ...
bridge ...
- 配置 ipvs 功能
在 kubernetes中service有两种代理模型, 一种是基于iptables, 另一种是基于 ipvs 的
ipvs 性能更高, 需要手动载入 ipvs 模块
# 1. 安装 ipset 和 ipbsadm
yum install -y ipset ipvsadm
# 2. 添加需要加载的模块写入脚本文件
cat <<EOF > /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
# 3. 为脚本文件添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
# 4. 执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules
-------- modprobe: FATAL: Module nf_conntrack_ipv4 not found.
# 5. 查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
2.2 环境搭建
三台centos, 一主二从, 每台安装docker(18.06.3), kubeadm(1.17.4) , kubelet(1.17.4), kubectl(1.17.4)
2.2.3 安装docker
# 1. 切换镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 2. 安装特定版本的docker-ce
# 必须指定 --setopt=obsoletes=0 否则yum会自动安装跟高版本
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
# 4. 添加一个配置文件
# docker在默认情况下使用的Cgroup Driver为cgroupfs, 而kubernetes推荐使用systemd来代替cgroupfs
mkdir /etc/docker
cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
# 5. q启动
systemctl start docker
systemctl enable docker
docekr version
安装kubernetes 组件
# 1. 切换国内源
# /etc/yum.repos.d/kubernetes.repo
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 安装kubeadm, kubelet, kubectl
yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
# 配置kubelet的cgroup
# 编辑/etc/sysconfig/kubelet, 添加
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
# 4. 设置kubelet开机自启
systemctl enable kubelet
准备集群镜像
# 在安装kubenetes集群之前毕业要提前准备好集群所需要的镜像
# 所需镜像可以通过下面命令查看
kubeadm config images list
# 下载镜像
# 此镜像在kubernetes的仓库中, 由于网路元婴无法连接, 下面采取另一种方案
# 直接在命令行输入
images=(
kube-apiserver:v1.17.4
kube-controller-manager:v1.17.4
kube-scheduler:v1.17.4
kube-proxy:v1.17.4
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)
for imageName in ${images[@]}; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
集群初始化
就是安装集群的过程。将node节点加入到集群中
下面的操作只需要在 master 节点上执行!
# 创建集群
kubeadm init \
--kubernetes-version=v1.17.4 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=master节点的IP
见输出
Your Kubernetes control-plane has initialized successfully!
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 nodes
查看只有master
根据提示信息,复制类似这样的一段,在其它两台机器上执行
kubeadm join 192.168.1.4:6443 --token 43v61u.v5pnbgu9poo9n4l3 \
--discovery-token-ca-cert-hash sha256:e0cc4efe8a66eec52728c7f2c97463eb25ca506bb9c7d5f6a355d500e2c17b04
kubectl get nodes
查看
[root@k8s-master01 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master01 NotReady master 8m17s v1.17.4
node1 NotReady <none> 24s v1.17.4
node2 NotReady <none> 8s v1.17.4
STATUS的状态是 NotReady, 是因为网络插件还没有安装, 还无法通信
安装网络插件
kubernetes支持多种网络插件, 比如 flannel, calico, canal … 本次选择 flannel
下面操作只在master上执行, 插件使用的是 DaemonSet 的控制器, 它会在每个节点上都运行
# 1. 需要下载一个 kube-flannel.yml , 国外源无法访问, 可以在csdn上找到
# 2. 使用配置文件启动 flannel
kubectl apply -f kube-flannel.yml
输出
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds-amd64 created
daemonset.apps/kube-flannel-ds-arm64 created
daemonset.apps/kube-flannel-ds-arm created
daemonset.apps/kube-flannel-ds-ppc64le created
daemonset.apps/kube-flannel-ds-s390x created
等几秒
[root@k8s-master01 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready master 50m v1.17.4
node1 Ready <none> 43m v1.17.4
node2 Ready <none> 42m v1.17.4
STATUS 都为 Ready
至此, kubernetes 集群环境安装完毕
2.3 服务部署
在kubernetes集群中部署一个nginx程序, 测试集群是否正常工作
以后的操作只需要操作 master
# 部署nginx
kubectl create deployment nginx --image=nginx:1.14-alpine
# deployment.apps/nginx created
# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# service/nginx exposed
# 查看服务状态:
[root@k8s-master01 ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-6867cdf567-smrxz 1/1 Running 0 2m27s
[root@k8s-master01 ~]$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 64m
nginx NodePort 10.97.229.43 <none> 80:30129/TCP 83s
# 其中需要关注的是 nginx 行的 PORT(S) 字段 80:30129/TCP
# 向外暴露的是 30129 端口, 最终会转到 80
# 我当前master的IP是 192.168.1.4, 所以浏览器访问 192.168.1.4:30129
# 即可见 Welcome to nginx!
资源管理
443/TCP 64m
nginx NodePort 10.97.229.43 80:30129/TCP 83s
其中需要关注的是 nginx 行的 PORT(S) 字段 80:30129/TCP
向外暴露的是 30129 端口, 最终会转到 80
我当前master的IP是 192.168.1.4, 所以浏览器访问 192.168.1.4:30129
即可见 Welcome to nginx!
# 资源管理
更多推荐
所有评论(0)