部署步骤:
1、环境准备:
master:192.168.222.150
node1:192.168.222.151
node2:192.268.222.152
三台CentOS7.6配置:2C,2G,20G
2、虚拟机安装
选择标准服务安装
3、环境初始化
以下内容没有特殊说明均是三台同时配置
1)检查操作系统版本
要求在7.5版本以上
[root@master ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
2)主机名解析
为了方便后面集群几点的直接调用,需要配置主机名解析。
#主机名解析,在三台服务器的/etc/hosts文件添加以下内容。
192.168.222.150 master
192.168.222.151 node1
192.168.222.152 node2
3)时间同步
kubernetes要求集群的节点时间必须精确一致,使用chronyd服务从网络同步时间。
#启动chronyd服务
systemctl start chronyd
#设置chronyd服务开机自启
systemctl enable chronyd
#使用date验证时间
4)禁用iptables和firewalld服务
kubernetes和docker运行会产生大量的iptables规则,为了不然系统规则与之混淆,需要关闭系统规则
#关闭firewalld服务
systemctl stop firewalld
systemctl disable firewalld
#关闭iptables
systemctl stop iptables
systemctl disable iptables
5)禁用selinux
#编辑/etc/selinux/config 文件,修改SELINUX的值为disabled
#重启Linux服务
SELINUX=disabled
[root@master ~]# getenforce
Enforcing #需要显示disabled
sed -i 's/enforcing/disabled/' /etc/selinux/config
5)禁用swap分区
#编辑分区配置文件/etc/fstab,注释掉swap分区一行
#重启Linux服务
#检查
[root@master ~]# free -m
total used free shared buff/cache available
Mem: 1819 123 1489 9 207 1518
Swap: 0 0 0
6)修改Linux的内核参数
#修改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
7)配置ipvs功能
kubernetes的service有两种代理模式,一种基于iptables,一种基于ipvs。ipvs的性能要高一些。
#安装ipset和ipvsadm
yum install ipset ipvsadmin -y
#添加需要加载的模块写入脚本文件
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
#为脚本文件按添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
#执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules
#查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
9)重启服务器
上面步骤完成之后,需要重新启动Linux系统。
reboot
4、集群组件安装
1)安装docker
#1、切换镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
#2、查看当前镜像源中支持的docker版本
yum list docker-ce --showduplicates
#、安装特定版本的docker-ce,指定--setopt=obsoletes=0 docker-cd-18.06.3.ce-3.el7 -y
#3、启动docker并设置开机自启
systemctl enable docker && systemctl start docker
#4、配置docker加速镜像
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"live-restore": true,
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"}
}
EOF
systemctl daemon-reload
systemctl restart docker
2)安装kubernetes组件
k8s镜像源在国外,所以需要切换为国内的镜像源
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
3)安装kubernetes、kubelet、kubectl
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,建议修改”/etc/sysconfig/kubelet”文件的内容:
vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
设置kubelet开机自启
systemctl enable kubelet
5、集群镜像
查看k8s所需要的镜像
[root@node2 yum.repos.d]# kubeadm config images list
I0803 18:09:17.042215 7603 version.go:252] remote version is much newer: v1.21.3; falling back to: stable-1.18
W0803 18:09:18.666101 7603 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
k8s.gcr.io/kube-apiserver:v1.18.20
k8s.gcr.io/kube-controller-manager:v1.18.20
k8s.gcr.io/kube-scheduler:v1.18.20
k8s.gcr.io/kube-proxy:v1.18.20
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7
1)集群初始化,将node节点加入到集群中
#替换镜像
images=(
kube-apiserver:v1.18.20
kube-controller-manager:v1.18.20
kube-scheduler:v1.18.20
kube-proxy:v1.18.20
pause:3.2
etcd:3.4.3-0
coredns:1.6.7
)
for imageName in ${images[@]} ; do
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
done
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
以下操作只需要在master节点上执行
#创建集群
# 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里需要指定阿里云镜像仓库地址
kubeadm init \
--apiserver-advertise-address=192.168.222.150 \ #集群通告地址
--image-repository registry.aliyuncs.com/google_containers \ #镜像仓库地址
--kubernetes-version v1.18.0 \ #k8s版本
--service-cidr=10.96.0.0/12 \ #集群内部虚拟网络,Pod统一访问入口
--pod-network-cidr=10.244.0.0/16 #pod网络,与flannel网络组件yaml中保持一致
报错了!!!

kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 13m v1.18.0
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
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:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.222.150:6443 --token mqbhly.0jtcynn95btf9qw2 \
--discovery-token-ca-cert-hash sha256:7261e8a3353a4c40f900ebc440dd0fdaa6ce407f60130de3997911b8426b89c6
node1和node2接入节点报错。报错结果如下
解决办法:
[root@node2 ~]# echo "1">/proc/sys/net/bridge/bridge-nf-call-iptables
[root@node2 ~]# echo "1">/proc/sys/net/bridge/bridge-nf-call-ip6tables
[root@node2 ~]# sysctl -w net.ipv4.ip_forward=1

加入master节点不成功,node节点需要重启docker!!!!
6、安装网络插件
kubernetes支持多种网络插件。如:flannel、calico、canal等。
以下操作只需要在master节点上执行
#获取flannel的配置文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#修改文件中quay.io仓库为quay-mirror.qiniu.com
#修改配置文件启动flannel
kubectl apply -f kube-flannel.yml
测试
1、服务部署
部署一个nginx程序。
#部署nginx
kubectl create deployment nginx --image=nginx:1.14-alpine

#暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort

#查看服务状态
kubectl get pods,svc
资源管理
namespace、pod命令
#创建一个namespace
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-55f8fd7cfc-dhb82 1/1 Running 0 27m
[root@master ~]# kubectl create namespace dev
namespace/dev created
[root@master ~]# kubectl get namespace
NAME STATUS AGE
default Active 4h12m
dev Active 13s
kube-node-lease Active 4h12m
kube-public Active 4h12m
kube-system Active 4h12m
#在dev下创建并运行一个nginx的pod
[root@master ~]# kubectl run pod --image=nginx -n dev
pod/pod created
[root@master ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pod 0/1 ContainerCreating 0 16s
[root@master ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pod 1/1 Running 0 50s
#删除指定的pod
[root@master ~]# kubectl delete pod nginx-55f8fd7cfc-dhb82 -n dev
pod "nginx-55f8fd7cfc-dhb82" deleted
#删除指定的namespace
[root@master ~]# kubectl delete ns dev
namespace "dev" deleted
[root@master ~]# kubectl get ns
NAME STATUS AGE
default Active 4h20m
kube-node-lease Active 4h20m
kube-public Active 4h20m
kube-system Active 4h20m
创建/更新资源 使用声明式对象配置 kubectl apply -f XXX.yaml
删除资源 使用命令式对象配置 kubectl delete -f XXX.yaml
查询资源 使用命令式对象管理 kubectl get(describe) 资源名称
namespace
[root@master ~]# kubectl describe namespace dev
Name: dev
Labels: <none>
Annotations: Status: Active
No resource quota.
No LimitRange resource.


