部署步骤:

1、环境准备:

master:192.168.222.150
node1:192.168.222.151
node2:192.268.222.152

  1. 三台CentOS7.6
  2. 配置:2C2G20G

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中保持一致

报错了!!!
image.png

image.png

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接入节点报错。报错结果如下
image.png
解决办法:

[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

image.png
加入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

image.png

测试

1、服务部署

部署一个nginx程序。

#部署nginx
kubectl create deployment nginx --image=nginx:1.14-alpine

image.png

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

image.png

#查看服务状态
kubectl get pods,svc

image.png
http://192.168.222.150:31230/
image.png

资源管理

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.