k8s快速体验

k8s yum部署及测试,后面有部分镜像和yml文件可私信后发出

一、master节点安装

1、hosts解析主机名

10.0.0.11 k8s-master
10.0.0.12 k8s-node-1
10.0.0.13 k8s-node-2

2、安装etcd键值对数据库(默认原生支持集群,要求三个节点)----master

yum install etcd -y
vim /etc/etcd/etcd.conf
6行:ETCD_LISTEN_CLIENT_URLS=“http://0.0.0.0:2379”
21行:ETCD_ADVERTISE_CLIENT_URLS=“http://10.0.0.11:2379”
systemctl start etcd.service
systemctl enable etcd.service
etcdctl set testdir/testkey0 0 设置一个值
etcdctl get testdir/testkey0 测试刚才设置的值
etcdctl set testdir/testkey4 4
etcdctl get testdir/testkey4
etcdctl -C http://10.0.0.11:2379 cluster-health
返回member 8e9e05c52164694d is healthy: got healthy result from http://10.0.0.11:2379
cluster is healthy

3、安装apiserver(master)

yum install kubernetes-master.x86_64 -y

vim /etc/kubernetes/apiserver
8行: KUBE_API_ADDRESS=“–insecure-bind-address=0.0.0.0”
11行:KUBE_API_PORT=“–port=8080”
14行: KUBELET_PORT=“–kubelet-port=10250”
17行:KUBE_ETCD_SERVERS=“–etcd-servers=http://10.0.0.11:2379”
23行:
KUBE_ADMISSION_CONTROL=“–admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota”
vim /etc/kubernetes/config
22行:KUBE_MASTER=“–master=http://10.0.0.11:8080”

systemctl enable kube-apiserver.service
systemctl restart kube-apiserver.service
systemctl enable kube-controller-manager.service
systemctl restart kube-controller-manager.service
systemctl enable kube-scheduler.service
systemctl restart kube-scheduler.service
检查
[root@k8s-master ~]# kubectl get componentstatus
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {“health”:“true”}

且浏览器可以访问http://10.0.0.11:8080/

二、安装node节点

yum install kubernetes-node.x86_64 -y (会自动安装docker,docker属于base源)

vim /etc/kubernetes/config proxy
22行:KUBE_MASTER=“–master=http://10.0.0.11:8080”

vim /etc/kubernetes/kubelet
5行:KUBELET_ADDRESS=“–address=0.0.0.0”
8行:KUBELET_PORT=“–port=10250”
11行:KUBELET_HOSTNAME=“–hostname-override=10.0.0.12”
14行:KUBELET_API_SERVER=“–api-servers=http://10.0.0.11:8080”

systemctl enable kubelet.service
systemctl restart kubelet.service docker会自动启动,docker起不来,kubelet也会起不来
systemctl enable kube-proxy.service
systemctl restart kube-proxy.service
Systemctl enable docker
在master节点检查

[root@k8s-master ~]# kubectl get nodes
NAME STATUS AGE
10.0.0.12 Ready 6m
10.0.0.13 Ready 3s

其中cadvidor会启动4194端口,在浏览器就可以看到节点信息所占用的资源

三、所有节点配置网络

yum install flannel -y
sed -i ‘s#http://127.0.0.1:2379#http://10.0.0.11:2379#g’ /etc/sysconfig/flanneld 所有节点向etcd写数据

##master节点:
etcdctl mk /atomic.io/network/config ‘{ “Network”: “172.18.0.0/16” }’

Flanneld启动之前需要etcd,所以先要设置一个key
Etcdctl get /atomic.io/network/config

yum install docker -y
Systemctl start docker
Ip a
Docker网络为172.17.0.1
systemctl enable flanneld.service
systemctl restart flanneld.service 会启动一个flanneld网卡段,系统自动分配的
Ip a可以看到flannel为172.18.94.0网段/172.18.8.0/16 172.18.36.0/16 182.18.78.0/16
systemctl restart docker docker的网络会变成和flannele网络同一个网段
Ip a可以看到docker的网络变了172.19.94.1段,docker和同主机的flannel保持同一网段
systemctl enable docker
systemctl restart kube-apiserver.service
systemctl restart kube-controller-manager.service
systemctl restart kube-scheduler.service

##node节点:
systemctl enable flanneld.service
systemctl restart flanneld.service 172.18.84.0/16
systemctl restart docker 此时docker的网络也是172.18.84.1/24
systemctl restart kubelet.service
systemctl restart kube-proxy.service

vim /usr/lib/systemd/system/docker.service
#在[Service]区域下增加一行
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT 永久生效
systemctl daemon-reload
systemctl restart docker

测试flannele网络能不能跨宿主机容器之间的通讯(需要查看内核转发参数,并且查iptables)
Iptables -P FORWARD ACCEPT(临时调整,开机关机,重启docker会重置)

测试容器之间跨宿主机通讯
1、上传alpine包load成镜像, docker load -i /docker_alpine.tar.gz
2、docker run -it alpine:latest ip a查看ip然后在另一个容器ping
如果不通,检查内核转发规则,检查iptables规则,有默认规则是允许,装上docker后就拒绝了。vim /usr/lib/systemd/system/docker.service
#在[Service]区域下增加一行
3、ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT

四、配置私有仓库

#所有节点

vi /etc/docker/daemon.json
{
“registry-mirrors”: [“https://registry.docker-cn.com”],
“insecure-registries”: [“10.0.0.11:5000”]
}

systemctl restart docker

#master节点
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
(上面命令会自己pull registry镜像)网络不好的情况还是自己上传镜像包,load -i进去
Docker ps
上传镜像至私有仓库测试
上传镜像load -i
docker tag docker.io/alpine:latest 10.0.0.11:5000/alpine:lastest 打包成私有仓库的格式
docker tag alpine:latest 10.0.0.11:5000/alpine:lastest docker images是啥样就是啥样
docker push 10.0.0.11:5000/alpine:lastest
如果上传镜像时报错received unexpected HTTP status: 500 Internal Server Error
查看selinux状,临时关闭setenforce 0后再次尝试上传镜像
然后在启动仓库容器的时候挂在的目录下面查看
/opt/myregistry/docker/registry/v2/repositories 或者
/opt/myregistry/docker/registry/v2/repositories

K8s使用场景:微服务
小程序不是微服务

  • 微服务架构里面是多个域名,每个域名都是自己独立的集群,每个域名都有自己的功能,几亿并发。好处是支持更大的并发,健壮性更好,某个业务挂了其他不影响,代码发布更快,程序难度更低
  • 传统mvc架构使用的是同一个域名,多个目录实现的,只能运行在一个集群里面,几百万并发,k8s微服务架构可以根据每个需求,创建ingress的控制器暴露不通的域名,k8s只是集群的管理者。

K8s资源都可以在yml文件里定义
k8s yaml的主要组成

apiVersion: v1 api版本
kind: pod 资源类型
metadata: 属性
spec: 详细

五、控制器实例

实例:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: web
spec:
containers:
- name: nginx
image: 10.0.0.11:5000/nginx:1.13 最好是先load 再tag push上传到仓库中去
ports:
- containerPort: 80

docker load -i /docker_nginx1.13.tar.gz
docker tag docker.io/nginx:1.13 10.0.0.11:5000/nginx:1.13
docker images
docker push 10.0.0.11:5000/nginx:1.13
命令:
vi k8s_pod.yaml
kubectl create -f k8s_pod.yaml
kubectl get pod
kubectl get pod -o wide
kubectl describe pod nginx
kubectl delete pod nginx 删除创建过的pod
Rc保证了副本数,如果要删除就删除yml文件kubectl delete -f replication.yml

pod-infrastructure-latest.tar—先将该镜像导入,上传,不然上面pod运行不起来
docker load -i /pod-infrastructure-latest.tar.gz
docker images
docker tag docker.io/tianyebj/pod-infrastructure:latest 10.0.0.11:5000/pod-infrastructure:latest
docker push 10.0.0.11:5000/pod-infrastructure:latest
重新create,查看结果

测试:curl http://172.18.36.2(pod的ip)
如果描述信息里面是谷歌仓库的需要更改(需要在nodes上改,默认是官方仓库去取)
vim /etc/kubernetes/kubelet
KUBELET_POD_INFRA_CONTAINER=“–pod-infra-container-image=10.0.0.11:5000/pod-infrastructure:latest”
systemctl restart kubelet.service

pod资源:至少由两个容器组成,pod基础容器和业务容器组成(最多1+4)

pod配置文件2:

apiVersion: v1
kind: Pod
metadata:
name: test
labels:
app: web
spec:
containers:
- name: nginx
image: 10.0.0.11:5000/nginx:1.13
ports:
- containerPort: 80
- name: alpine
image: 10.0.0.11:5000/alpine:latest
command: [“sleep”,“1000”]

查看pod的时候就是
test 2/2 Running 113 207d

实例3
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 5 #副本5
selector:
app: myweb
template:
metadata:
labels:
app: myweb
spec:
containers:
- name: myweb
image: 10.0.0.11:5000/nginx:1.13
ports:
- containerPort: 80

实例4

apiVersion: v1
kind: Service #简称svc
metadata:
name: myweb
spec:
type: NodePort #默认ClusterIP
ports:
- port: 80 #clusterIP
nodePort: 30000 #node port
targetPort: 80 #pod port
selector:
app: myweb
访问nodeIP:30000,首先得有pod或deployent启动,然后service使用标签选择器关联pod
http://10.0.0.12:30000

实例5
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
minReadySeconds: 60
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: 10.0.0.11:5000/nginx:1.13
ports:
- containerPort: 80
resources:
limits:
cpu: 100m
requests:
cpu: 100m
kubectl get pod

kubectl logs nginx-2807576163-dngqt 查看某一pod的日志

K8s的schedule调度默认是公平的,rr轮询,也会看资源分配,第一次创建的和第二次创建的平均分配

Pod资源 最小的资源单位
Rc资源
ReplicationController资源 保证指定数量的pod存活,通过标签选择器关联
service资源 帮助pod暴露端口
deployment资源 滚动升级后服务不会中断
Ingress 暴露服务端口和域名

探针的作用,是探测k8s集群里面不健康的pod。
默认情况下,k8s会观察pod的生命周期,并在容器从挂起状态转换到成功状态时,将流量路由到pod,k8s会检测崩溃的应用程序,并重新启动pod进行恢复,许多开发人员认为这样的基本设置就足够了,尤其是当pod内的应用程序还配置了守护进程管理器时。
但有一种意外情况,当k8s在所有容器启动后,认为pod是健康且可以接受请求时,但应用程序在实际准备就绪之前就收到流量,比如应用程序在处理应用程序逻辑之前,初始化了一些状态,建立了数据库连接或加载了数据,当deployment开始扩展时,未就绪的应用程序就会接受流量并返回500错误,这就造成了应用程序实际的准备就绪与k8s人为的准备就绪之间的时间间隔问题。

六、dns服务

1:下载dns_docker镜像包(node2节点10.0.0.13)
wget http://192.168.37.200/191127/docker_k8s_dns.tar.gz
2:导入dns_docker镜像包(node2节点10.0.0.13)因为这个镜像有四个,而且版本和私有仓库不一样,不需要在仓库拉去,创建的时候会指定到这台主机。
3:创建dns服务
vi skydns-rc.yaml

spec:
nodeName: 10.0.0.13
containers:
kubectl create -f skydns-rc.yaml
kubectl create -f skydns-svc.yaml

4:检查
kubectl get all --namespace=kube-system
5:修改所有node节点kubelet的配置文件
vim /etc/kubernetes/kubelet
KUBELET_ARGS=“–cluster_dns=10.254.230.254 --cluster_domain=cluster.local”
systemctl restart kubelet
七、dashboard服务
1:上传并导入镜像,打标签
docker load -i /kubernetes-dashboard-amd64_v1.4.1.tar.gz
docker tag index.tenxcloud.com/google_containers/kubernetes-dashboard-amd64:v1.4.1 10.0.0.11:5000/kubernetes-dashboard-amd64:v1.4.1
docker push 10.0.0.11:5000/kubernetes-dashboard-amd64:v1.4.1
2:创建dashborad的deployment和service
kubectl create dashboard.yaml
kubectl create -f dashboard-svc.yaml
3:访问http://10.0.0.11:8080/ui/

可以看到所有创建的资源。

八、创建ingress代理service

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-app-ingress
spec:
rules:

  • host: app.aaa.com
    http:
    paths:
    - path: /
    backend:
    serviceName: myweb
    servicePort: 80

必须在service层级就能访问,然后ingress使用backend关联service的name

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值