在学习k8s的过程中,通过实践的方式,将一些常用的命令总结下来。

机器配置

主机配置:2G、2C、100G

master node:master1

worker node:worker1、worker2

查看IP:

ip addr
# 或者
ip a s

修改主机名:

hostnamectl set-hostname XXX

查看主机名:

hostname

设置IP:

vi /etc/sysconfig/network-scripts/ifcfg-ens33

BOOTPROT0="none"
IPADDR="172.16.177.100"
PREFIX="24"
GATEWAY="172.16.177.2"
DNS1="119.29.29.29"

重启网卡:

systemctl restart network

修改host文件(需要在root下):

vi /etc/hosts

172.16.177.100 master1
172.16.177.101 worker1
172.16.177.102 worker2 

主机安全配置

关闭防火墙:

// 查看防护墙状态
systemctl status firewalld
// 停用防火墙
systemctl stop firewalld
// 开机禁用
systemctl disable firewalld
// 验证状态
firewall-cmd --state

selinux修改:

// 查看
sestatus 或者 getenforce
// 修改
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
// 重启生效
reboot
// 验证
getenforce

主机时间同步:

// 安装ntpdate
yum -y install ntpdate
// 设置同步规则
crontab -e
// 上一步内容
0 */1 * * * ntpdate time1.aliyun.com
// 主动同步
ntpdate time1.aliyun.com

关闭swap分区

使用kubeadm部署k8s,必须关闭swap分区,然后重启使配置生效

// 查看
cat /etc/fstab
// 注释swap行
vi /etc/fstab
// 重启
reboot

添加网桥过滤及地址转发

// 创建一个k8s配置文件 
vi /etc/sysctl.d/k8s.conf
// 上一步内容
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
// 加载br_netfilter模块
modprobe br_netfilter
// 查看是否加载
lsmod | grep br_netfilter
// 加载网桥过滤配置文件
sysctl -p /etc/sysctl.d/k8s.conf

开启ipvs

 // 安装ipset及ipvsadm
 yum -y install ipset ipvsadm
 // 添加需要加载的模块,放到新建的文件ipvs.modules中
 cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash
 modprobe -- ip_vs
 modprobe -- ip_vs_rr
 modprobe -- ip_vs_wrr
 modprobe -- ip_vs_sh
 modprobe -- nf_conntrack_ipv4
EOF
// 授权、运行、检查是否加载
chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules 
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

安装docker-ce

在manager节点及worker节点安装指定版本的docker-ce

// yum源获取
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
// 查看yum源版本
yum list docker-ce.x86_64 --showduplicates | sort -r
// 安装指定版本,示例中的版本是比较稳定的
yum -y install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7
// 验证
docker version
// 设置docker开机自启
systemctl enable docker
// 启动docker
systemctl start docker
// 查看docker状态
systemctl status docker

修改docker-ce服务配置文件

// 修改docker的服务配置文件,当前版本不用修改,此步可以跳过。(包含ExecStart=XXX时需要修改)
cat /usr/lib/systemd/system/docker.service
// 增加配置文件
vi /etc/docker/daemon.json
// 文件内容,指定docker的驱动:原生的
{
    "exec-opts":["native.cgroupdriver=systemd"]
}
// 重启docker
systemctl restart docker

相关关联软件安装

包括:kubeadm、kubelet、kubectl、docker-ce(已安装)

// 创建存放文件:阿里云的k8s yum源
vi /etc/yum.repos.d/k8s.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
// 验证是否可用
yum list | grep kubeadm
// 复制当前yum源到其他两台机器的相同目录下
scp /etc/yum.repos.d/k8s.repo worker1:/etc/yum.repos.d/
// 安装指定版本
yum -y install --setopt=obsoletes=0 kubeadm-1.17.2-0 kubelet-1.17.2-0 kubectl-1.17.2-0

修改kubelet配置

// 保持docker的cgroupdriver和kubelet的cgroup一致性
vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
// 开机自启
systemctl enable kubelet

集群镜像

master镜像

// 查看镜像
kubeadm config images list
// 将所有镜像保存到文件中,该方式是使用谷歌镜像,需要FQ
kubeadm config images list >> images.list
// 查看保存的文件
cat images.list
// 修改脚本(下载)
vi images.list
#!/bin/bash
img_list='k8s.gcr.io/kube-apiserver:v1.17.2
k8s.gcr.io/kube-controller-manager:v1.17.2
k8s.gcr.io/kube-scheduler:v1.17.2
k8s.gcr.io/kube-proxy:v1.17.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5'

for img in ${img_list}
do
        docker pull $img
done
// 执行脚本
sh images.list
// 改编后的脚本,可以从阿里云下载镜像
#!/bin/bash
img_list='kube-apiserver:v1.17.2
    kube-controller-manager:v1.17.2
    kube-scheduler:v1.17.2
    kube-proxy:v1.17.2
    pause:3.1
    etcd:3.4.3-0
    /coredns:1.6.5'

for img in ${img_list}
do
        docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$img
        docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$img k8s.gcr.io/$img
        docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$img
done
// 验证
docker images 

worker镜像

// 从master节点上保存两个文件
docker save -o kube-p.tar k8s.gcr.io/kube-proxy:v1.17.2
docker save -o pause.tar k8s.gcr.io/pause:3.1
// 拷贝到两台worker机器的root下
scp kube-p.tar pause.tar worker1:/root/
// 在worker机器上导入
docker load -i kube-p.tar
docker load -i pause.tar
// 验证
docker images

K8S集群初始化

// 在master上操作,该操作决定哪一台是master节点
kubeadm init --kubernetes-version=v1.17.2 --pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=172.16.177.100
// 按照第一步完成后的提示操作
mkdir .kube
cp -i /etc/kubernetes/admin.conf .kube/config
// calico资源:
// 从官网下载calico.yaml文件,并找到镜像的版本为v3.15.1
cat calico.yaml | grep image: | awk '{print $2}'
calico/cni:v3.15.1
calico/pod2daemon-flexvol:v3.15.1
calico/node:v3.15.1
calico/kube-controllers:v3.15.1
// 镜像下载
docker pull quay.io/calico/cni:v3.15.1
docker pull quay.io/calico/pod2daemon-flexvol:v3.15.1
docker pull quay.io/calico/node:v3.15.1
docker pull quay.io/calico/kube-controllers:v3.15.1
// 在当前目录导出镜像为压缩包
docker save -o calico-cni-v3.15.1.tar quay.io/calico/cni:v3.15.1
docker save -o calico-pod2daemon-flexvol-v3.15.1.tar quay.io/calico/pod2daemon-flexvol:v3.15.1
docker save -o calico-node-v3.15.1.tar quay.io/calico/node:v3.15.1
docker save -o calico-kube-controllers-v3.15.1.tar quay.io/calico/kube-controllers:v3.15.1
// 修改calico.ymal文件
// 执行使生效
kubectl apply -f calico.yaml
// 挂载
docker load -i XXX
// 执行一个自建的脚本,kubeadm join 生成token,同步到每个worker
sh gene_kube_token.sh 172.16.177.100

验证集群可用性

// 查看节点状态
kubectl get nodes
// 查看集群健康状态
kubectl get cs
或者
kubectl cluster-info
// 查看所有pods
kubectl get pods --namespace kube-system

使用集群

kubectl管理工具的使用:

// 检查kubectl是否安装
rpm -qa | grep kubectl
// 获取kubectl帮助
kubectl --help

使用worker管理集群:

mkdir .kube
scp master1:/root/.kube/config .kube/
// 验证
kubectl get nodes
或
kubectl get pods -n kube-system

namespace:命名空间

namespace:命名空间:多租户下,实现资源隔离;

// 查看命名空间
kubectl get namespace
或
kubectl get ns
// 创建命名空间:方式一
kubectl create namespace XXX
// 创建命名空间:方式二,通过资源清单文件创建
cat xxx.yaml .   // 准备资源文件
kubectl apply -f xxx.yaml // 应用资源文件
// 删除命名空间:方式一
kubectl delete namespace XXX
// 删除命名空间:方式二,通过资源清单文件删除
cat XXX.yaml // 准备资源清单文件
kubectl delete -f XXX.yaml  // 删除资源清单文件

拉取nginx镜像

// 拉取nginx镜像,只需要在worker节点中
docker pull registry.cn-shenzhen.aliyuncs.com/yansongda/nginx:latest
docker tag registry.cn-shenzhen.aliyuncs.com/yansongda/nginx nginx-latest
docker rmi registry.cn-shenzhen.aliyuncs.com/yansongda/nginx

pod

pod:k8s能够调度的最小单元,是容器的封装

// 查看默认namespace的pod
kubectl get pod
或
kubectl get pods
// 查看指定namespace的pod
kubectl get pod --namespace kube-system
或
kubectl get pod -n kube-system

// 创建pod
vim 02-create-pod.yaml
apiVersion: v1
kind: Pod
metadata: 
  name: pod1
spec:
  containers:
  - name: nginx-container
    image: nginx-latest
    imagePullPolicy: Never
    ports:
    - name: nginxport
      containerPort: 80
// 应用资源清单
kubectl apply -f 02-create-pod.yaml
// 验证
kubectl get pods -n 
或
kubectl get pods -o wide // 显示更详细信息

// 删除pods,也可以通过删除资源清单
kubectl delete pods pod1 -n default
kubectl delete -f 02-create-pod.yaml

进入pod:

// podID:v7-scm-6db4b69f58-gbjzc,namespace:ns-retail-feature1
 kubectl exec -it v7-scm-6db4b69f58-gbjzc -n ns-retail-feature1  /bin/bash

controller

controller:pod控制器,当pod不可用时重新拉起,提供高可用的实现

// 创建deployment控制器:用于部署、升级、副本...
// 创建一个nginx的应用
kubectl run nginx-app1 --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=2
// 查看应用
kubectl get deployment.apps
// 查看创建
kubectl get replicaset
// 除了上面赭红方式也可以通过资源清单文件来做

// 删除控制器,不能直接删除pod,删除后会被立马拉起
kubectl delete deployment.apps nginx-app1

service

service:用于对pod控制访问,即客户端访问pod入口

service是一条iptables或ipvs的转发规则,不是实体服务

// 1、创建应用
kubectl run nginx-app1 --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=1
// 2、将service和应用关联
kubectl expose deployment.apps nginx-app1 --type=ClusterIp --target-port=80 --port=80
// 查看service
kubectl get service
// 删除service
kubectl delete service nginx-app1