-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Elafros resources: the missing link #412
Comments
Problem SummaryIn summary, there is a desire to have a more structured grouping than provided in the Elafros API. This is appealing from the standpoint of product simplicity and potentially reduced cognitive load on our users, leading to a more elegant CLI/UI experience. This is a proposed solution to Problem 1 as stated above. Problem 2 will be addressed in a separate comment for that reason, we will refer to this resource simply at “Steve” for purposes of this proposal. Proposed SolutionSteve will exist as a higher level resource that users interact with in order to make changes to their compute services, rather than interacting with Route and Configuration directly. The ability to restrict muate access to Route and Configuration is up to the cluster operator. Steve is a composition of 2 pieces of information, a name, and a rollout policy. There will be several kind of rollout policies defined, but Steve can only accept one at a time. This is inspired by the k8s core Volume and associated kinds that appear in it. Steve is a new CRD that will be hosted at github.com/elafros/steve along with a full OSS implementation of Steve. Use of Steve is optional in Elafros. Atomic Rollout PolicyThere is a single name for Steve, which creates a corresponding Route, and a single Configuration object. When the Steve object is created, a Route and Configuration will be created, and the appropriate metadata.ownerReferences values will be set. In this scenario, the user creates a Steve object with a simple rollout type (runLatest) and a single Configuration. In the example below, this results in 4 objects being created: The specified Steve object, a route named “my-function”, a configuration named "my-function", and the first revision. When the first revision is created, it will begin serving.
ManualIf a user finds themselves in a broken state, they can switch their Steve to have a rollout policy of manual. Manual requires a specific revision, which will upon reconciliation be immediately set to 100% in the route, and no further automatic changes will happen until the Steve is switched to a different kind. Upon reconciliation, the Route is adjusted to point 100% to the specified revisionName. The revisionName provided must belong to the configuration contained by Steve.
Changing Between StevesIn general, changing between different specializations of Steve (different rollout policies) is a fine and normal thing to do.. For the case of a user that is in the simple case, using runLatest, and they have a bad push. In order to recover from the bad push, they switch the rollout policy to “manual” and pin their Steve to a specific revision. When the user has sufficiently patched their configuration, they simply change Steve back to runLatest and resume the release train. Future ExpansionThese are just two example rollout policies. There are other rollout policies that will be proposed as individual issues once the new repository is created. |
I don't like the name To elaborate on that a bit, I think that Ordinarily, my expectation is that when I'd propose an alternate concept of apiVersion: elafros.dev/v1alpha1
kind: Steve
metadata:
name: my-function
spec:
# The underlying resources become the source of truth.
manual: {} If a user changes to If a user changes from This is a bit weird for Kubernetes objects, but I find this variation surprisingly appealing. In particular, the capacity to switch between this model (Some Ops) and a more managed model (No Ops). To be clear: I would expect UX to degrade in @vaikas-google @mikehelmick @steren WDYT? |
I support allowing access to the underlying resources. This is probably better for tooling compatibility. I am convinced that the only thing we need is better grouping. We could consider |
Chatted w/ @mikehelmick and I think we have a nice way to represent automatic and manual Automatic
|
Last week I conducted research with 47 developers to assess names for As context for the naming exercises, participants were given a walkthrough of a basic UI, CLI, and the diagram @steren shared above. They were then asked to provide their own name for After providing their own suggestions, participants completed a MaxDiff survey in order to demonstrate their preferences toward some names that were being considered. MaxDiff analysis was performed using this code from E. Bahna, & C. Chapman (2018). "Constructed, Augmented MaxDiff." In B. Orme, ed. (forthcoming), Proceedings of the 2018 Sawtooth Software Conference, Orlando, FL. March 2018. Result of the MaxDiff Overall, “service” and “component” were the top two candidates both when names were solicited as well as in the MaxDiff preference exercise, with “service” performing slightly better. |
Thanks for driving this study @tliberman. This is a strong case for After consulting with @kelseyhightower, we suggest to use
This means that This solves Problem 2: Name described in my original issue. |
I spoke with several of you offline. The proposed solution still stands, with a name change to What I had named as We will be setting up this resource in a new repository, likely elafros/service. I will close this issue once that repository is created. |
One challenge of the name-collision is the
(not sure if hyphens are allowed) I've been debating |
* add types for Service and generate related code. Issue #412 * add types for Service and generate related code. Issue #412 * Convert tabs to spaces, reformat service_types.go * add tests for service types * convert tabs to spaces * fix spelling mistakes in service definition * rerun codegen after fixing spelling in json types
I've created #591 to add this functionality to the conformance tests. |
You can do:
kubectl get service.elafros.dev
better, but still not that super awesome.
…On Wed, Mar 28, 2018 at 9:29 PM Matt Moore ***@***.***> wrote:
One challenge of the name-collision is the kubectl experience, where
typing kubectl get services won't WAI (I think you'd need to
fully-qualify elafros.dev/v1alpha1/Service). Something I'd suggest here
(and possibly for the other CRDs) is that we adopt "shortNames" in our CRD
descriptors, which allow you to alias the resource:
# shortNames allow shorter string to match your resource on the CLI
shortNames:
- ela-svc
(not sure if hyphens are allowed)
I've been debating revision => rev and configuration => cfg for some time
to save myself some typing, but here I think it's especially useful.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#412 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AKwedAMVHii1EBl4vSHHS4Agkrx-u1Qfks5tjGMsgaJpZM4SuqUs>
.
|
The initial type definition and skeleton controller have gone in, and we're starting to break out smaller issues for missing things (e.g. docs), so I'm going to optimistically close this issue. If there is some reason for it to still exist, please reopen with a comment explaining why. |
To expand on the research @tliberman shared and further assess our object model, we conducted a study with 19 participants: 9 with mostly Operator responsibilities, 8 with mostly Developer responsibilities, and 2 with an even split of both. Qualitative data demonstrated that participants define a |
Has any of this research been shared with the Kubernetes sig-apps group? ChairsThe Chairs of the SIG run operations and processes governing the SIG.
|
This patch contains following changes: - to remove istio related resources - to bump servleress-operator to v1.5.0
Here is an illustration showing a very common use case: Within one cluster, developers deployed, and later updated, two different "components of their architecture", for examples, a "function that implements an API endpoint" and a "web frontend".
As a result, from a API resource perspective, there are two Routes, each of them pointing to a different Revision that has been created from a Configuration:
Notice the orange boxes:
In our example, they represent the "function" and the "web Frontend". They are what Google Cloud Functions or AWS Lambda would call today a "Function". Or what App Engine would call a "Service", and Cloud Foundry an "Application".
We are currently performing some user research to understand how users think about these and how they would name them.
Problem statement
Problem 1: A missing higher level concept
Conceptually, neither the Route nor the Configuration are the top level entities that map exactly to the concept used in my introduction (the "function" and the "web frontend"). In most cases, we want developers to think first about the orange boxes, and later, if needed about the Route and Configuration(s).
Saying that an orange box is equivalent to a Route is not strictly correct because there is no parent-children or ownership relationship enforced by Elafros between a Route and Configuration(s). A Configuration can live completely detached from a Revision.
Problem 2: Name
Neither the names "Route" or "Configuration" are a good fit for this "orange box", these terms should not be the top level "thing" to create or the main collection of things our end users operate against.
I am opening this issue to evaluate solutions to these problems.
The text was updated successfully, but these errors were encountered: